2015-02-05 19 views
6

Tôi muốn đặt một số văn bản trong GUI và tôi muốn biết kích thước chính xác là uicontrol của loại 'text' cần phải!Thuộc tính văn bản 'Extent' không chứa đúng kích thước

Tôi đã tìm thấy một số chủ đề giải thích rằng điều này có thể được thực hiện bằng cách sử dụng 'Extent' tài sản của một đối tượng 'text' chứa cùng một văn bản, xem ví dụ:

function form = tempfunc(txt,font,fontsize) 
    if nargin <3 
     fontsize = 10; 
    end 
    if nargin < 2 
     font = 'courier'; 
    end 
    f = figure('Visible','off','Units','pixels'); 
    u = uicontrol(f,'Style','text','Units','pixels','String',txt,'FontName',font,'FontSize',fontsize); 
    textsize = get(u,'Extent'); 
    textsize = textsize(3:4); 
    close(f); 

    form = figure('Units','pixels'); 
    uicontrol(form,'Style','text','Units','pixels','String',txt,'FontName',font,'FontSize',fontsize,'Position',[5,5,textsize]); 
end 

vấn đề của tôi bây giờ là điều này không hoạt động. Khi tôi chạy trên với tempfunc(repmat('A',14)); tôi nhận được cửa sổ như hình sau:

enter image description here

Như bạn có thể nhìn thấy từ hình ảnh đỉnh cao của văn bản trích trong biến textsize là quá nhỏ!

Lưu ý rằng đây là kết quả tôi nhận được khi tôi chạy chương trình trên máy tính chạy Windows của tôi chạy Matlab R2014a. Sau đó tôi chạy chính xác cùng một mã trên một máy Linux chạy Matlab R2013b, và trên máy đó tôi đã nhận được kết quả mà tôi muốn. GUI tôi đang tạo nên (hy vọng) có thể chạy trên bất kỳ máy tính nào, nhưng ngay bây giờ tôi thực sự thua lỗ về cách tôi nên tiến hành tạo một phiên bản hoạt động trên bất kỳ máy nào, vì vậy hãy giúp tôi!

EDIT: Tôi cố gắng để chạy cùng mã trên một máy tính Windows 7 (phiên bản này lần cuối cùng thay vì phiên bản Enterprise của tôi) chạy Matlab R2011b (thay vì R2014a của tôi), nó vẫn tạo ra chiều cao sai của hộp văn bản - nhưng lần này vào hộp văn bản là quá cao - xem hình ảnh:

enter image description here

EDIT2: tôi cuối cùng đã R2014b cài đặt, nhưng đáng tiếc nó đã không giúp đỡ! tôi nhận được một bức tranh nhìn tương tự:

enter image description here

Tôi cũng đã cố gắng để xem nếu lựa chọn khác nhau của độ phân giải màn hình của tôi thực hiện bất kỳ sự khác biệt - họ không.

EDIT3:

tôi đã nhận thấy rằng phông chữ khác nhau mang lại các lỗi khác nhau trong chiều cao, ví dụ phông chữ mặc định (MS Sans Serif) mang lại một hộp văn bản quá cao (và lỗi này ở chiều cao cũng tăng lên khi nhiều dòng được thêm vào) - Tuy nhiên, trên Linux tôi đã nhận được kết quả chính xác cho tất cả các phông chữ mà tôi đã thử.

Nhưng thực sự trường hợp tôi quan tâm nhất là trường hợp sử dụng phông chữ chuyển phát nhanh, vì tôi cần một phông chữ đơn cách cho mục đích của mình.

+0

Tôi có hành vi đúng theo R2014b, Ubuntu 14.04. Vì họ đã thay đổi độ phân giải đồ họa theo chiều sâu cho R2014b, có vẻ như loại vấn đề này hiện đã được sửa. – Ratbert

+0

Tôi nghĩ rằng đó đơn giản chỉ vì nó là linux, nó không giúp gì cả khi tôi cài đặt R2014b. –

+0

Tôi xác nhận tôi quan sát vấn đề này trong R2014b và trong R201b, cả trên Windows –

Trả lời

1

Quan sát phía Java của sự vật, Swing thành phần có một số phương pháp quan tâm:

Vấn đề là, "kích thước ưa thích" có vẻ là kích thước chính xác (whic h bạn tìm kiếm), trong khi kích thước được trả về bởi get(...,'Extent');nhìn thấy kích thước, trong đó có ý nghĩa như sau:

getVisibleRect()

Returns "hình chữ nhật có thể nhìn thấy" của Component - ngã ​​tư của thành phần này của hình chữ nhật có thể nhìn thấy, hình chữ nhật mới (0, 0, getWidth(), getHeight()) và tất cả hình chữ nhật có thể nhìn thấy của tổ tiên của nó.

Để làm rõ ở trên: trang trí theo chủ đề và nền tảng cụ thể của cửa sổ hình có thể giảm không gian sẵn có của thành phần và do đó kích thước có thể nhìn thấy (như đã đề cập here).

Như một ví dụ số, khi chạy với các thiết lập mặc định và repmat('A',14), tôi nhận được (trên Win7, MATLAB 2015a):

  • get(u,'Extent') - [0,0,116,214]
  • jHandle.getVisibleRect-java.awt.Rectangle[x=0,y=0,width=116,height=214]
  • jHandle.getSize-java.awt.Dimension[width=116,height=214]
  • jHandle.getPreferredSize - java.awt.Dimension[width=116,height=221]

Bây giờ câu hỏi là làm thế nào để có được PreferredSize (hoặc jHandle mà từ đó nó có thể được truy xuất) thuận tiện ...

Một lựa chọn, mà tôi sử dụng, là tiện ích findjobj, mà sử dụng cũng đơn giản như jHandle = findjobj(u).

Để tóm tắt:

  1. Nơi findjobj trong thư mục làm việc của bạn.
  2. Thay thế hai dòng nơi bạn tìm thấy textsize của thành viên này:

    v = findjobj (u); textsize = [v.getPreferredSize.getWidth v.getPreferredSize.getHeight];

  3. LỢI NHUẬN.

P.S.

Lý do của tôi có thể thiếu sót và hiểu về Swing không chính xác, tuy nhiên giải thích này hợp lý với tôi và quan trọng hơn - nó hoạt động.

Các vấn đề liên quan