Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JLabel在有空间显示完整标签时显示省略号_Java_Swing_Jlabel - Fatal编程技术网

Java JLabel在有空间显示完整标签时显示省略号

Java JLabel在有空间显示完整标签时显示省略号,java,swing,jlabel,Java,Swing,Jlabel,JLabel在有空间显示完整标签时显示省略号 我的代码: ​import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame

JLabel在有空间显示完整标签时显示省略号

我的代码:

​import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.plaf.basic.BasicLookAndFeel;

import com.bulenkov.darcula.DarculaLaf;

public class GUI implements ActionListener {
    
    private int count = 0;
    private JLabel label;
    private JFrame frame;
    private JPanel panel;
    
    public GUI() throws UnsupportedLookAndFeelException  {
        
        BasicLookAndFeel darcula = new DarculaLaf();
        UIManager.setLookAndFeel(darcula);
        
        frame = new JFrame();
        
        JButton button = new JButton("Click Me");
        button.addActionListener(this);
        
        label = new JLabel("Number of clicks: 0");
        
        
        panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(20, 100, -85, 100));
        panel.setLayout(new GridLayout(5, 1));
        panel.add(button);
        panel.add(label);
        
        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        ///frame.setTitle("Cool GUI");
        frame.pack();
        frame.setVisible(true);
    }
    
    public static void main(String[] args) throws UnsupportedLookAndFeelException {
        new GUI();
        
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        count++;
        label.setText("Number of clicks: " + count);
    }

}

Oracle有一个很好的教程,教您Swing的基础知识。跳过Netbeans部分

我创建了以下GUI

这就是我所做的

  • 我通过调用
    SwingUtilities
    invokeLater
    方法启动了Swing GUI。此方法确保在上创建并执行所有Swing组件

  • 我将构建
    JFrame
    的代码与构建
    JPanel
    的代码分开。必须按特定顺序调用
    JFrame
    方法。这是我在大多数Swing应用程序中使用的顺序

  • 我按照Swing组件顺序构造
    JPanel
    。我将所有与特定Swing组件相关的方法放在一起

  • 我把“点击次数:”文本放在一个地方

  • 下面是完整的可运行代码

    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class BasicGUI implements ActionListener, Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new BasicGUI());  
        }
        
        private int count;
        
        private JLabel label;
        
        public BasicGUI() {
            this.count = 0;
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Cool GUI");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            frame.add(createMainPanel(), BorderLayout.CENTER);
    
            frame.pack();
            frame.setResizable(false);
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        private JPanel createMainPanel() {
            JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5));
            panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            
            JButton button = new JButton("Click Me");
            button.addActionListener(this);
            panel.add(button);
            
            label = new JLabel();
            label.setHorizontalAlignment(JLabel.CENTER);
            updateLabel(0);
            panel.add(label);
            
            return panel;
        }
        
        public void updateLabel(int count) {
            label.setText("Number of clicks: " + count);
        }
        
        @Override
        public void actionPerformed(ActionEvent event) {
            updateLabel(++count);
        }
        
    }
    

    Oracle有一个很好的教程,教您Swing的基础知识。跳过Netbeans部分

    我创建了以下GUI

    这就是我所做的

  • 我通过调用
    SwingUtilities
    invokeLater
    方法启动了Swing GUI。此方法确保在上创建并执行所有Swing组件

  • 我将构建
    JFrame
    的代码与构建
    JPanel
    的代码分开。必须按特定顺序调用
    JFrame
    方法。这是我在大多数Swing应用程序中使用的顺序

  • 我按照Swing组件顺序构造
    JPanel
    。我将所有与特定Swing组件相关的方法放在一起

  • 我把“点击次数:”文本放在一个地方

  • 下面是完整的可运行代码

    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class BasicGUI implements ActionListener, Runnable {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new BasicGUI());  
        }
        
        private int count;
        
        private JLabel label;
        
        public BasicGUI() {
            this.count = 0;
        }
    
        @Override
        public void run() {
            JFrame frame = new JFrame("Cool GUI");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            frame.add(createMainPanel(), BorderLayout.CENTER);
    
            frame.pack();
            frame.setResizable(false);
            frame.setLocationByPlatform(true);
            frame.setVisible(true);
        }
    
        private JPanel createMainPanel() {
            JPanel panel = new JPanel(new GridLayout(0, 1, 5, 5));
            panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            
            JButton button = new JButton("Click Me");
            button.addActionListener(this);
            panel.add(button);
            
            label = new JLabel();
            label.setHorizontalAlignment(JLabel.CENTER);
            updateLabel(0);
            panel.add(label);
            
            return panel;
        }
        
        public void updateLabel(int count) {
            label.setText("Number of clicks: " + count);
        }
        
        @Override
        public void actionPerformed(ActionEvent event) {
            updateLabel(++count);
        }
        
    }
    

    我认为GridBagLayout会在初始化UI时询问JLabel所需的大小。然后为JLabel分配请求的大小

    在运行时,JLabel需要显示的字符串会发生变化,实际上它会变长。但是没有重新布局,因此不允许JLabel使用更多的空间-即使在屏幕上似乎有足够的空间


    解决方案是告诉GridBagLayout为该组件保留足够的空间,或者允许动态缩放。查看详细信息。

    我认为GridBagLayout会在初始化UI时询问JLabel所需的大小。然后为JLabel分配请求的大小

    BasicLookAndFeel darcula = new DarculaLaf();
    UIManager.setLookAndFeel(darcula);
    
    在运行时,JLabel需要显示的字符串会发生变化,实际上它会变长。但是没有重新布局,因此不允许JLabel使用更多的空间-即使在屏幕上似乎有足够的空间

    解决方案是告诉GridBagLayout为该组件保留足够的空间,或者允许动态缩放。详细信息请查看

    BasicLookAndFeel darcula = new DarculaLaf();
    UIManager.setLookAndFeel(darcula);
    
    在询问基本问题时,不要使用第三方LAF

    我们不知道问题是否与LAF或JDK的标准类有关

    JLabel在有空间显示完整标签时显示省略号

    实际上它没有空间,因为您使用
    pack()
    方法,所有组件都会根据组件的首选大小和应用于组件的边框的首选大小以其首选大小显示

    当我运行代码(使用默认LAF)时,文本在启动时正确显示

    这是因为面板的宽度由JButton的首选宽度控制,因为它是较大的组件

    但是,如果我将按钮的文本更改为:

    label.setText("Number of clicks made: " + count);
    
    现在面板的宽度由标签的首选宽度控制,因为它大于按钮的宽度

    同样,在启动时,文本会正确显示

    但是,如果您单击按钮10次,则“计数”将从一位数字更改为两位数字,这将增加标签的首选大小,从而显示“…”

    一个简单的解决方案是使用:

    count++;
    label.setText("Number of clicks made: " + count);
    frame.pack();
    
    现在,将调整框架的大小,以适应新计算的标签首选大小

        panel.setLayout(new GridLayout(5, 1));
    
    另外,不要硬编码GridLayout的“行”。上面的代码为5个组件保留空间,即使您只有2个组件

    而是使用:

    panel.setLayout(new GridLayout(0, 1));
    
    表示包含任意数量组件的单个列

    然后您可以正确使用EmptyByOrder,使其在所有方面都对称:

    //panel.setBorder(BorderFactory.createEmptyBorder(20, 100, -85, 100));
    panel.setBorder(BorderFactory.createEmptyBorder(20, 100, 20, 100));
    
    在询问基本问题时,不要使用第三方LAF

    我们不知道问题是否与LAF或JDK的标准类有关

    JLabel在有空间显示完整标签时显示省略号

    实际上它没有空间,因为您使用
    pack()
    方法,所有组件都会根据组件的首选大小和应用于组件的边框的首选大小以其首选大小显示

    当我运行代码(使用默认LAF)时,文本在启动时正确显示

    这是因为面板的宽度由JButton的首选宽度控制,因为它是较大的组件

    但是,如果我将按钮的文本更改为:

    label.setText("Number of clicks made: " + count);
    
    现在面板的宽度由标签的首选宽度控制,因为它大于按钮的宽度

    同样,在启动时,文本会正确显示

    但是,如果您单击按钮10次,则“计数”将从一位数字更改为两位数字,这将增加标签的首选大小,从而显示“…”

    一个简单的解决方案是使用:

    count++;
    label.setText("Number of clicks made: " + count);
    frame.pack();
    
    现在,将调整框架的大小,以适应新计算的标签首选大小

        panel.setLayout(new GridLayout(5, 1));
    
    另外,不要硬编码GridLayout的“行”。上面的代码为5个组件保留了空间,即使是零