Java – center jlabel in jpanels

I'm making a score retention plan, but I have a problem What I'm trying to do is have a JPanel containing two jpanels at the top, and the JPanel contains two team names I wonder why the two jlabels at the top of the program are not concentrated in the jpanels they contain

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class scoreFrame extends JFrame {

    private static final Dimension SCREEN_SIZE = Toolkit.getDefaultToolkit().getScreenSize();
    private static final int WIDTH = SCREEN_SIZE.width;
    private static final int HEIGHT = SCREEN_SIZE.height;
    private final JTextField[] nameField = new JTextField[] { new JTextField(),new JTextField() };
    private final JLabel[] nameLabel = new JLabel[] { new JLabel("Team 1"),new JLabel("Team 2") };
    private final GridBagLayout gridBag = new GridBagLayout();
    private final GridBagConstraints constraints = new GridBagConstraints();
    private final JPanel topPanel = new JPanel();

    public scoreFrame() {
    super();
    setResizable(false);
    setSize(SCREEN_SIZE);
    setLayout(gridBag);
    setUndecorated(true);
    setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(new EscapeListener());
    addComponents();
    }

    private void addComponents() {
    addToTopPanel();
    constraints.insets = new Insets(0,(int) (HEIGHT * (double) 4 / 5),0);
    gridBag.setConstraints(topPanel,constraints);

    add(topPanel);
    }

    private void addToTopPanel() {
    final JPanel[] teamPanel = new JPanel[] { new JPanel(),new JPanel() };
    topPanel.setLayout(gridBag);
    topPanel.setSize(new Dimension(WIDTH,HEIGHT / 5));

    Dimension teamPanelSize = new Dimension(WIDTH / 2,HEIGHT / 5);
    teamPanel[0].setSize(teamPanelSize);
    teamPanel[1].setSize(teamPanelSize);

    Font nameFont = new Font("Times New Roman",Font.PLAIN,50);
    nameLabel[0].setFont(nameFont);
    nameLabel[1].setFont(nameFont);

    teamPanel[0].add(nameLabel[0]);
    teamPanel[1].add(nameLabel[1]);

    gridBag.setConstraints(teamPanel[0],constraints);

    constraints.gridx = 1;
    gridBag.setConstraints(teamPanel[1],constraints);

    topPanel.add(teamPanel[0]);
    topPanel.add(teamPanel[1]);
    }

    public void paint(Graphics g) {
    super.paint(g);
    int strokeSize = ((WIDTH + HEIGHT) / 2) / 300;
    if (strokeSize < 1) {
        strokeSize = 1;
    }

    final int fontSize = (int) (strokeSize * 12.5);

    Graphics2D g2d = (Graphics2D) g;
    g2d.setstroke(new Basicstroke(strokeSize));
    g.drawLine(WIDTH / 2,WIDTH / 2,HEIGHT / 5);
    g.drawLine(WIDTH / 2,(int) (HEIGHT * (double) 105 / 400),HEIGHT);
    g.drawLine(0,HEIGHT / 5,WIDTH,HEIGHT / 5);
    g.drawRect((int) (WIDTH * (double) 45 / 100),WIDTH / 10,(int) (HEIGHT * (double) 3 / 20));

    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
    g.setFont(new Font("Times New Roman",fontSize));
    g.drawString("Errors",(int) (WIDTH * (double) 101 / 220),HEIGHT / 4);
    }

    private JFrame getFrame() {
    return this;
    }

    public static void main(final String args[]) {
    new scoreFrame().setVisible(true);
    }

    public class EscapeListener implements KeyListener {

    public void keyPressed(final KeyEvent event) {
        if (event.getKeyCode() == 27) {
        final int choice = JOptionPane.showConfirmDialog(getFrame(),"Do you want to exit the program?");

        if (choice == 0) {
            System.exit(0);
        }
        }
    }

    public void keyReleased(final KeyEvent event) {
    }

    public void keyTyped(final KeyEvent event) {
    }
    }
}

Solution

Calling pack () is a key step in using layout This example uses jlabel Center and GridLayout center labels when resizing frames For simplicity, the center panel is just a placeholder This slightly more complex example uses Java text. Messageformat is similar

Appendix: but how do I apply pack () to my code?

Just call pack (), as shown in the referenced example I don't see a simple way to save your current set size Instead, the main content of getpreferredsize () is overwritten in JPanel Regardless of the screen size, the implementation of paintcomponent () should adapt to the current size for example

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see https://stackoverflow.com/a/14422016/230513 */
public class scores {

    private final JLabel[] nameLabel = new JLabel[]{
        new JLabel("Team 1",JLabel.CENTER),new JLabel("Team 2",JLabel.CENTER)};

    private void display() {
        JFrame f = new JFrame("scores");
        f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        JPanel teamPanel = new JPanel(new GridLayout(1,0));
        teamPanel.add(nameLabel[0]);
        teamPanel.add(nameLabel[1]);
        f.add(teamPanel,BorderLayout.NORTH);
        f.add(new JPanel() {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(320,240);
            }
        },BorderLayout.CENTER);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokelater(new Runnable() {

            @Override
            public void run() {
                new scores().display();
            }
        });
    }
}
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>