Текст JLabel больше размера JLabel и превращается в "..." - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в Java, и я хотел сделать простой GUI с кнопкой, которая учитывается, когда вы нажимаете на нее, я следовал этому руководству на YouTube, чтобы добраться туда. Все прошло очень хорошо, и все сработало. Но одного не произошло: конец текста JLabel идет от числа (9) до .... Изменение размера окна вручную возвращает число, поэтому я попытался изменить размер шрифта, окна, кнопки и размера метки в коде при его запуске, что работает , но у меня все равно возникает та же проблема.

Это мой код для кнопки:

JButton button = new JButton("Click me!");
    button.addActionListener(this);

... который, я полагаю, мог бы назвать это:

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

Я пробовал другие решения по другим вопросам но они совершенно не помогли.

Мой полный код для GUI таков:

package javaGUI;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import javax.swing.JButton;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GUI implements ActionListener {
    private int count = 0;
    private JLabel label;
    private JFrame frame;
    private JPanel panel;

    public GUI() {
        frame = new JFrame();

        JButton button = new JButton("Click me!");
        button.addActionListener(this);
        button.setPreferredSize(new Dimension(10, 75));

        label = new JLabel("Number of clicks: 0");
        label.setFont(new Font("System", Font.PLAIN, 22));

        panel = new JPanel();
        panel.setBorder(BorderFactory.createEmptyBorder(60, 100, 30, 100));
        panel.setLayout(new GridLayout(0, 1));
        panel.add(button);
        panel.add(label);

        frame.add(panel, BorderLayout.CENTER);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("GUI");
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new GUI();
    }

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

}

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

По сути, вы должны дать JLabel пространство для роста.

Вот один из способов сделать это.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class ClickMe implements ActionListener, Runnable {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new ClickMe());
    }

    private int count = 0;
    private JLabel label;
    private JFrame frame;

    @Override
    public void run() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Click Me");

        JPanel buttonPanel = new JPanel();

        JButton button = new JButton("Click me!");
        button.addActionListener(this);
        button.setFont(new Font("System", Font.PLAIN, 22));
        button.setPreferredSize(new Dimension(300, 75));
        buttonPanel.add(button);

        frame.add(buttonPanel, BorderLayout.CENTER);

        JPanel labelPanel = new JPanel();

        label = new JLabel("Number of clicks: 0");
        label.setFont(new Font("System", Font.PLAIN, 22));
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.CENTER);
        labelPanel.add(label);

        frame.add(labelPanel, BorderLayout.AFTER_LAST_LINE);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

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

}
0 голосов
/ 19 июня 2020

Когда фрейм «упакован» до того, как он станет видимым, все компоненты отображаются в их предпочтительном размере.

Проблема в том, что когда вам нужно отобразить несколько цифр в метке, размер меток предпочтительный увеличивается, но во фрейме недостаточно места для полного отображения текста метки, поэтому текст усекается. их предпочтительный размер:

label.setText("Number of clicks: " + count);
frame.pack();

Также обратите внимание, что вы не должны устанавливать свойства метки в ActionListener. При создании метки должны быть установлены следующие свойства:

label = new JLabel("Number of clicks: 0");
label.setHorizontalTextPosition(JLabel.CENTER);
label.setVerticalTextPosition(JLabel.CENTER);
...