2011-12-30 32 views
5

Trong kết nối với hai bài @iMohammad, Increasing/Decreasing Font Size inside textArea using JButtonChanging Font Style when Clicking on a JButton Java ..., tôi phải đối mặt với vấn đề thực sự hài hước đến từ JComboBox bằng cách thông qua setPrototypeDisplayValue như một cuộc tranh cãi cho JComboBox's size trên màn hìnhTại sao JComboBox bỏ qua PrototypeDisplayValue

hài lòng như thế nào tôi có thể thay đổi kích thước JComboBox động phụ thuộc của Font, giống như tác phẩm một cách chính xác cho một JComponents rằng tôi đã cố gắng trong tôi sscce

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class ComboBoxFontChange extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private JComboBox cbox = new JComboBox(); 
    private JTextField tfield = new JTextField("Change"); 
    private JLabel label = new JLabel("Cash"); 
    private JButton button = new JButton("++ Font"); 
    private JTextField text; 
    private JPanel panel = new JPanel(); 

    public ComboBoxFontChange() { 
     super("Combo Box Font change"); 
     text = (JTextField) cbox.getEditor().getEditorComponent(); 
     cbox.addItem("Change"); 
     cbox.addItem("Cash"); 
     cbox.addItem("Font"); 
     tfield.setColumns(5); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       Font font = cbox.getFont(); 
       font = font.deriveFont((float) (font.getSize2D() * 1.10)); 
       cbox.setFont(font); 
       // EDIT 
       cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString()); 
       tfield.setFont(font); 
       button.setFont(font); 
       label.setFont(font); 
       //panel.revalidate(); 
       //panel.repaint(); 
       pack(); 
      } 
     }); 
     //panel.setLayout(new GridLayout(2, 2, 10, 10)); 
     panel.add(cbox); 
     panel.add(label); 
     panel.add(tfield); 
     panel.add(button); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     add(panel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       ComboBoxFontChange frame = new ComboBoxFontChange(); 
       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
} 

Trả lời

4

Tôi đã sửa lỗi SSCCE của bạn và giá trị được chuyển đến setPrototypeDisplayValue là chuỗi rỗng. Thay đổi dòng thành

cbox.setPrototypeDisplayValue(cbox.getSelectedItem()); 

Làm cho mọi thứ hoạt động như mong đợi. Việc xóa cuộc gọi tới setPrototypDisplayValue cũng làm cho chương trình hoạt động như mong đợi.

EDIT:

Vấn đề khác là không có sự kiện là bắn cho giá trị hiển thị nguyên mẫu bởi vì bạn đặt nó là giá trị trước đó như trước, và một sự kiện được chỉ bị sa thải nếu giá trị thực sự thay đổi. Thêm cbox.setPrototypeDisplayValue(""); trước cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString()) làm cho mọi thứ hoạt động như mong đợi, ngay cả trên JDK 1.6. Tôi đồng ý rằng nếu phông chữ được thay đổi, kích thước ưa thích sẽ được tính toán lại, nhưng ít nhất thay đổi này là một giải pháp thay thế.

+0

do nhầm lẫn Tôi đã chỉnh sửa các dòng mã sai, nhanh tay, bây giờ là chính xác làm ví dụ – mKorbel

+0

Vui lòng giải thích chương trình nên làm gì và thay vào đó. Mọi thứ dường như hoạt động như mong đợi (JDK 1.7.0_02-ea). –

+0

:-) phần còn lại của chúng tôi vẫn còn trong Java6, JComboBox vẫn có cùng kích thước trên màn hình – mKorbel

1

Tôi đã thử những gì JB Nizet đã nói. Nhưng đối với tôi kích thước comboBox không thay đổi. CÒn bạn thì sao?

Vì vậy, tôi đã thử cách sau và kích thước hộp combo tăng lên khi tôi tăng kích thước phông chữ.

cbox.setFont(font); 
cbox.updateUI(); 

tôi cũng loại bỏ dòng

cbox.setPrototypeDisplayValue(text.getText()); 
+0

+1 công trình, nhưng có một vấn đề khác, phải có 'Lỗi', vì' updateUI (Look and Feel) 'hoạt động như chúng tôi mong đợi, tôi nghĩ rằng vấn đề này không liên quan gì đến cập nhật 'Nhìn và Cảm thấy', lạ – mKorbel

+0

Không sử dụng phương thức updateUI().Đó là cho một sự thay đổi LAF. Thay đổi phông chữ không phải là một thay đổi LAF. – camickr

1

Để tham khảo, một GridLayout và tám nhấp chuột cho kết quả này trên Mac OS X:

panel.setLayout(new GridLayout(0, 1, 10, 10)); 

Combo: combo Popup: popup

Là một bên, cbox.updateUI() res mặc định mặc định do đại diện giao diện người dùng Aqua quy định, com.apple.laf.AquaComboBoxUI.

+0

đồng ý rằng về FlowLayout và JComboBox – mKorbel

1

Đây là mã từ BasicComboBoxUI:

 else if (propertyName == "font") { 
      listBox.setFont(comboBox.getFont()); 
      if (editor != null) { 
       editor.setFont(comboBox.getFont()); 
      } 
      isMinimumSizeDirty = true; 
      comboBox.validate(); 
     } 
     else if (propertyName == JComponent.TOOL_TIP_TEXT_KEY) { 
      updateToolTipTextForChildren(); 
    } 
     else if (propertyName == BasicComboBoxUI.IS_TABLE_CELL_EDITOR) { 
      Boolean inTable = (Boolean)e.getNewValue(); 
    isTableCellEditor = inTable.equals(Boolean.TRUE) ? true : false; 
     } 
    else if (propertyName == "prototypeDisplayValue") { 
      isMinimumSizeDirty = true; 
      isDisplaySizeDirty = true; 
      comboBox.revalidate(); 
     } 

Đối với một số lý do có sự thay đổi Font chỉ reset "kích thước tối thiểu" không phải là "hiển thị kích thước".

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