首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么JComboBox会忽略PrototypeDisplayValue

为什么JComboBox会忽略PrototypeDisplayValue
EN

Stack Overflow用户
提问于 2011-12-30 20:26:01
回答 4查看 3K关注 0票数 5

关于这两个帖子@iMohammad,Increasing/Decreasing Font Size inside textArea using JButtonChanging Font Style when Clicking on a JButton Java ...,我遇到了一个非常有趣的问题,它来自JComboBox,在屏幕上传递了setPrototypeDisplayValue作为JComboBox's size的参数

请告诉我如何动态调整依赖于FontJComboBox的大小,就像我在我的sscce中尝试的另一个JComponents一样

代码语言:javascript
运行
复制
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);
            }
        });
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-30 20:55:39

我调试了您的SSCCE,传递给setPrototypeDisplayValue的值是空字符串。将行更改为

代码语言:javascript
运行
复制
cbox.setPrototypeDisplayValue(cbox.getSelectedItem());

让一切都按预期工作。删除对setPrototypDisplayValue的调用也会使程序的行为符合预期。

编辑:

另一个问题是,不会为原型显示值触发任何事件,因为您像以前一样将其设置为前一个值,并且只有在该值实际发生更改时才会触发事件。在cbox.setPrototypeDisplayValue(cbox.getSelectedItem().toString())之前添加cbox.setPrototypeDisplayValue("");可以使一切按预期运行,即使在JDK1.6上也是如此。我同意,鉴于字体已更改,应重新计算首选大小,但至少此更改是一种变通方法。

票数 4
EN

Stack Overflow用户

发布于 2011-12-30 20:59:29

我试过JB Nizet说的。但对我来说,comboBox的大小并没有改变。你呢?

因此,我尝试了以下方法,随着字体大小的增加,组合框的大小也随之增加。

代码语言:javascript
运行
复制
cbox.setFont(font);
cbox.updateUI();

我还删除了这行代码

代码语言:javascript
运行
复制
cbox.setPrototypeDisplayValue(text.getText()); 
票数 1
EN

Stack Overflow用户

发布于 2011-12-30 23:25:56

作为参考,在Mac上,一次GridLayout和八次单击给出了以下结果:

代码语言:javascript
运行
复制
panel.setLayout(new GridLayout(0, 1, 10, 10));

组合:

弹出窗口:

顺便说一句,cbox.updateUI()恢复了Aqua代表com.apple.laf.AquaComboBoxUI指定的默认值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8679421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档