本文介绍了JFrame GridBagLayout组件定位的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我使用的是null布局,但被告知这是一个糟糕的主意,因此决定使用GridBagLayout,因为它应该是最容易定制的。我在定位我的组件时遇到了麻烦,我真的很困惑,我如何在屏幕的中间位置找到一个标签,我的桌子在中间,我的登录按钮在右下方。有谁知道怎么做?



这是我的代码:

  import javafx.geometry.Horizo​​ntalDirection; 

import javax.swing。*;
import javax.swing.table.DefaultTableModel;
import java.awt。*;
import java.awt.event。*;

公共类Main
{

JFrame window = new JFrame(PE Fixture); // JFrame变量

JPanel container = new JPanel();
JPanel guestFixturesPanel = new JPanel();
JPanel loginPanel = new JPanel();
JPanel adminFixturesPanel = new JPanel();
JPanel createPanel = new JPanel();

String [] columns = {Sport,Location,Date,Result};
String [] [] data = {{Football,AQA Highschool,12.11.13,5 - 0},
{Tennis,Wembley,26.11 .14。,TBC}};


CardLayout cardLayout = new CardLayout();
GridBagConstraints c = new GridBagConstraints();

public Main()
{

container.setLayout(cardLayout);

guestFixturesPanel.setLayout(new GridBagLayout()); // GUEST FIXTURES PANEL COMPONENTS

JButton loginButton = new JButton(Login);
c.gridx = 0;
c.gridy = 2;
c.insets = new Insets(0,0,10,0);
guestFixturesPanel.add(loginButton,c);
JTable fixturesTable = new JTable(data,columns)
{
public boolean isCellEditable(int data,int columns)
{
return false;
}
};
fixturesTable.setPreferredScrollableViewportSize(new Dimension(500,300));
fixturesTable.setFillsViewportHeight(true);
JScrollPane scrollTable = new JScrollPane(fixturesTable);
c.gridx = 0;
c.gridy = 0;
c.ipady = 700;
c.ipadx = 400;
guestFixturesPanel.add(scrollTable,c);
JLabel fixturesLabel = new JLabel(FIXTURES);
fixturesLabel.setFont(new Font(TimesRoman,Font.PLAIN,50));
fixturesLabel.setForeground(Color.WHITE);
c.gridx = 0;
c.gridy = 0;
guestFixturesPanel.add(fixturesLabel,c);

container.add(guestFixturesPanel,2); // LABELS每个组件的号码为
container.add(loginPanel,3);
container.add(adminFixturesPanel,4);
container.add(createPanel,5);

guestFixturesPanel.setBackground(Color.DARK_GRAY); //每个面板的颜色
loginPanel.setBackground(Color.DARK_GRAY);
adminFixturesPanel.setBackground(Color.DARK_GRAY);
createPanel.setBackground(Color.DARK_GRAY);
cardLayout.show(container,1);

window.add(容器); //创建程序的框架。
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setSize(500,860);
window.setResizable(false);
window.setVisible(true);

}

public static void main(String [] args)
{

SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new Main();
}
});

}
}

编辑:

  import javax.swing。*; 
import javax.swing.table.DefaultTableModel;
import java.awt。*;
import java.awt.event。*;

公共类Main
{
String [] columns = {Sport,Location,Date,Result};
String [] [] data = {{Football,AQA Highschool,12.11.13,5 - 0},
{Tennis,Wembley,26.11 .14。,TBC}};

private void createAndShowGUI()
{
CardLayout layout = new CardLayout();

JPanel guestCard = new JPanel(布局);
JPanel guestTitle = new JPanel(new FlowLayout(FlowLayout.CENTER)); // GUEST TOP PANEL
JLabel fixturesLabel = new JLabel(FIXTURES);
fixturesLabel.setFont(new Font(TimesRoman,Font.PLAIN,50));
fixturesLabel.setForeground(Color.WHITE);
guestTitle.add(fixturesLabel);
JTable fixturesTable = new JTable(数据,列)// GUEST MID PANEL
{
public boolean isCellEditable(int data,int columns)
{
return false;
}
};
fixturesTable.setPreferredScrollableViewportSize(new Dimension(350,450));
fixturesTable.setFillsViewportHeight(true);
JScrollPane scrollTable = new JScrollPane(fixturesTable);
JPanel guestBot = new JPanel(new FlowLayout(FlowLayout.RIGHT)); // GUEST BOT PANEL
JButton loginButtonGuest = new JButton(Login);
guestBot.add(loginButtonGuest);



JPanel loginCard = new JPanel(layout); // LOGIN TOP PANEL
JPanel loginTitle = new JPanel(new FlowLayout(FlowLayout.CENTER));
JLabel loginLabel = new JLabel(LOGIN);
loginLabel.setFont(new Font(TimesRoman,Font.PLAIN,50));
loginLabel.setForeground(Color.WHITE);
loginTitle.add(loginLabel);

JPanel container = new JPanel(new BorderLayout(8,8)); // ADDS CARDS TO CONTAINER
container.add(guestCard,2);
container.add(loginCard,3);

guestCard.add(guestTitle,BorderLayout.NORTH); // ADDS COMPONENTS TO CARDS
guestCard.add(scrollTable,BorderLayout.CENTER);
guestCard.add(guestBot,BorderLayout.SOUTH);
loginCard.add(loginTitle,BorderLayout.NORTH);

container.setBackground(Color.DARK_GRAY); // COLORS CARDS
guestTitle.setBackground(Color.DARK_GRAY);
scrollTable.setBackground(Color.DARK_GRAY);
guestBot.setBackground(Color.DARK_GRAY);

layout.show(container,1);

JFrame window = new JFrame(PE Fixtures); // CREATE WINDOW
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane()。add(container);
window.setSize(400,700);
window.setLocationRelativeTo(null);
window.setResizable(false);
window.setVisible(true);

}

public static void main(String [] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
new Main()。createAndShowGUI();
}
});
}
}

错误:

 C:\Program Files\Java\jdk1.7.0_51\bin\java-Didea.launcher.port = 7533-Didea。 launcher.bin.path = C:\Program Files(x86)\ JetBrains\IntelliJ IDEA Community Edition 13.0.2\bin-Dfile.encoding = UTF-8 -classpathC:\Program Files \ Java \jdk1.7.0_51\jre\lib\charsets.jar; C:\Program Files \ Java @\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ Program Files\Java\jdk1.7.0_51\jre\lib\javaws.jar; C:\Program Files\Java\jdk1.7.0_51\jre\lib\jce.jar; C:\Program Files\Java \jdk1.7.0_51 \ jre \ lib \ _jfr.jar; C:\Program Files \ Java \ jdk1.7.0_51 \ jre \ lib \ jfxrt.jar; C:\Program Files\Java\jdk1.7.0_51\jre\lib\jsse.jar; C:\Program Files\Java\jdk1.7.0_51\jre\\ \\lib\managem ent-agent.jar; C:\Program Files\Java\jdk1.7.0_51\jre\lib\plugin.jar; C:\Program Files\Java\jdk1.7.0_51 \ jre\lib\resources.jar; C:\Program Files\Java \ jdk1.7.0_51 \ jre \lib \ t.jar; C:\Program Files \ Java \\\\\\\\\\\\ 7.0_51\jre\lib\ext\access-bridge-64.jar; C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\dnsns.jar ; C:\Program Files \ Java \\\\\\\ \\ lib\ext \localedata.jar; C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunec.jar; C:\Program Files \ Java \jdk1.7.0_51\jre\lib\ext\sunjce_provider.jar; C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunmscapi.jar ; C:\Program Files\Java \ jdk1.7.0_51 \ jre \lib \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\文件(x86)\JetBrains\IntelliJ IDEA社区版13.0.2\lib\idea_rt.jar AWT-EventQueue的 -  0 线com.intellij.rt.execution.application.AppMain主要
异常 java.lang.IllegalArgumentException:无法添加到布局:未知约束:2
at java.awt.BorderLayout.addLayoutComponent(BorderLayout.java:463)
at java.awt.BorderLayout.addLayoutComponent(BorderLayout。 java:424)
at java.awt.Container.addImpl(Container.java:1120)
at java.awt.Container.add(Container.java:966)
at Main.createAndShowGUI (Main.java:48)
在Main.access $ 000(Main.java:8)
在Main $ 2.run(Main.java:77)
在java.awt.event。 InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
在java.awt.EventQueue.access $ 200(EventQueue.java:103)$ B $在java.awt.EventQueue中$ 3.run(EventQueue.java:694)
B在java.awt.EventQueue中$ 3.run( EventQueue.java:692)
在java.security.AccessController.doPrivileged(本机方法)
在java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:76)
。在java.awt中.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents( EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)


解决方案

如你所见:








So, I was using null layout but was told it was a terrible idea and so decided to use GridBagLayout, as it's supposedly the easiest to customise. I'm having trouble with positioning my components, I am really confused as to how I can get a label to the top middle of the screen, my table in the middle, and my login button to the bottom right. Does anyone know how to do this?

Here's my code:

import javafx.geometry.HorizontalDirection;

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

public class Main
{

    JFrame window = new JFrame("PE Fixture");   //JFrame variables

    JPanel container = new JPanel();
    JPanel guestFixturesPanel = new JPanel();
    JPanel loginPanel = new JPanel();
    JPanel adminFixturesPanel = new JPanel();
    JPanel createPanel = new JPanel();

    String[] columns = {"Sport", "Location", "Date", "Result"};
    String[][] data = {{"Football", "AQA Highschool", "12.11.13", "5 - 0"},
            {"Tennis", "Wembley", "26.11.14.", "TBC"}};


    CardLayout cardLayout = new CardLayout();
    GridBagConstraints c = new GridBagConstraints();

    public Main()
    {

        container.setLayout(cardLayout);

        guestFixturesPanel.setLayout(new GridBagLayout());        //GUEST FIXTURES PANEL COMPONENTS

        JButton loginButton = new JButton("Login");
        c.gridx = 0;
        c.gridy = 2;
        c.insets = new Insets(0, 0, 10, 0);
        guestFixturesPanel.add(loginButton, c);
        JTable fixturesTable = new JTable(data, columns)
        {
            public boolean isCellEditable(int data, int columns)
            {
                return false;
            }
        };
        fixturesTable.setPreferredScrollableViewportSize(new Dimension(500, 300));
        fixturesTable.setFillsViewportHeight(true);
        JScrollPane scrollTable = new JScrollPane(fixturesTable);
        c.gridx = 0;
        c.gridy = 0;
        c.ipady = 700;
        c.ipadx = 400;
        guestFixturesPanel.add(scrollTable, c);
        JLabel fixturesLabel = new JLabel("FIXTURES");
        fixturesLabel.setFont(new Font("TimesRoman", Font.PLAIN, 50));
        fixturesLabel.setForeground(Color.WHITE);
        c.gridx = 0;
        c.gridy = 0;
        guestFixturesPanel.add(fixturesLabel, c);

        container.add(guestFixturesPanel, "2");         //LABELS EACH COMPONENT WITH A NUMBER
        container.add(loginPanel, "3");
        container.add(adminFixturesPanel, "4");
        container.add(createPanel, "5");

        guestFixturesPanel.setBackground(Color.DARK_GRAY);      //Colours each panel
        loginPanel.setBackground(Color.DARK_GRAY);
        adminFixturesPanel.setBackground(Color.DARK_GRAY);
        createPanel.setBackground(Color.DARK_GRAY);
        cardLayout.show(container, "1");

        window.add(container);          //Creates the frame of the program.
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setSize(500, 860);
        window.setResizable(false);
        window.setVisible(true);

    }

    public static void main(String[] args)
    {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Main();
            }
        });

    }
}

EDIT:

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

    public class Main
    {
        String[] columns = {"Sport", "Location", "Date", "Result"};
        String[][] data = {{"Football", "AQA Highschool", "12.11.13", "5 - 0"},
                {"Tennis", "Wembley", "26.11.14.", "TBC"}};

        private void createAndShowGUI()
        {
            CardLayout layout = new CardLayout();

            JPanel guestCard = new JPanel(layout);
            JPanel guestTitle = new JPanel(new FlowLayout(FlowLayout.CENTER));               //GUEST TOP PANEL
            JLabel fixturesLabel = new JLabel("FIXTURES");
            fixturesLabel.setFont(new Font("TimesRoman", Font.PLAIN, 50));
            fixturesLabel.setForeground(Color.WHITE);
            guestTitle.add(fixturesLabel);
            JTable fixturesTable = new JTable(data, columns)                                 //GUEST MID PANEL
            {
                public boolean isCellEditable(int data, int columns)
                {
                    return false;
                }
            };
            fixturesTable.setPreferredScrollableViewportSize(new Dimension(350, 450));
            fixturesTable.setFillsViewportHeight(true);
            JScrollPane scrollTable = new JScrollPane(fixturesTable);
            JPanel guestBot = new JPanel(new FlowLayout(FlowLayout.RIGHT));                  //GUEST BOT PANEL
            JButton loginButtonGuest = new JButton("Login");
            guestBot.add(loginButtonGuest);



            JPanel loginCard = new JPanel(layout);                                           //LOGIN TOP PANEL
            JPanel loginTitle = new JPanel(new FlowLayout(FlowLayout.CENTER));
            JLabel loginLabel = new JLabel("LOGIN");
            loginLabel.setFont(new Font("TimesRoman", Font.PLAIN, 50));
            loginLabel.setForeground(Color.WHITE);
            loginTitle.add(loginLabel);

            JPanel container = new JPanel(new BorderLayout(8,8));                           //ADDS CARDS TO CONTAINER
            container.add(guestCard, "2");
            container.add(loginCard, "3");

            guestCard.add(guestTitle, BorderLayout.NORTH);                                  //ADDS COMPONENTS TO CARDS
            guestCard.add(scrollTable, BorderLayout.CENTER);
            guestCard.add(guestBot, BorderLayout.SOUTH);
            loginCard.add(loginTitle, BorderLayout.NORTH);

            container.setBackground(Color.DARK_GRAY);                                       //COLOURS CARDS
            guestTitle.setBackground(Color.DARK_GRAY);
            scrollTable.setBackground(Color.DARK_GRAY);
            guestBot.setBackground(Color.DARK_GRAY);

            layout.show(container, "1");

            JFrame window = new JFrame("PE Fixtures");                                      //CREATES WINDOW
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.getContentPane().add(container);
            window.setSize(400, 700);
            window.setLocationRelativeTo(null);
            window.setResizable(false);
            window.setVisible(true);

        }

        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Main().createAndShowGUI();
                }
            });
        }
    }

ERROR:

"C:\Program Files\Java\jdk1.7.0_51\bin\java" -Didea.launcher.port=7533 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 13.0.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_51\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\rt.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_51\jre\lib\ext\zipfs.jar;C:\Users\Harry\Desktop\Computer Science Projects\PE Fixtures v2.0\out\production\PE Fixtures v2.0;C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 13.0.2\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain Main
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: cannot add to layout: unknown constraint: 2
    at java.awt.BorderLayout.addLayoutComponent(BorderLayout.java:463)
    at java.awt.BorderLayout.addLayoutComponent(BorderLayout.java:424)
    at java.awt.Container.addImpl(Container.java:1120)
    at java.awt.Container.add(Container.java:966)
    at Main.createAndShowGUI(Main.java:48)
    at Main.access$000(Main.java:8)
    at Main$2.run(Main.java:77)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
解决方案

As you can see GridBagLayout is not the simplest layout manager (too much troubles and not really too much power). To lay out this little amount of components I'd suggest you use a Nested Layout approach:

  • Use BorderLayout to lay out the "main" panel components (label, table and button).
  • Use FlowLayout to center the label inside a top panel and place the button at the right in a bottom panel.

Example

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class Demo {

    private void createAndShowGUI() {

        JLabel label = new JLabel("Title");
        label.setFont(label.getFont().deriveFont(Font.BOLD | Font.ITALIC, 18));
        JPanel topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        topPanel.add(label);

        DefaultTableModel model = new DefaultTableModel(new Object[]{"Column # 1", "Column # 2"}, 0);
        model.addRow(new Object[]{"Property # 1", "Value # 1"});
        model.addRow(new Object[]{"Property # 2", "Value # 2"});
        model.addRow(new Object[]{"Property # 3", "Value # 3"});

        JTable table = new JTable(model);
        JScrollPane scrollPane = new JScrollPane(table);

        JButton button = new JButton("Log In");
        JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        bottomPanel.add(button);

        JPanel content = new JPanel(new BorderLayout(8, 8));
        content.add(topPanel, BorderLayout.NORTH);
        content.add(scrollPane, BorderLayout.CENTER);
        content.add(bottomPanel, BorderLayout.SOUTH);

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(content);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().createAndShowGUI();
            }
        });
    }
}

Screenshot


In addition

For more complex GUI designs you may want to try one of these third-party layout managers suggested in this answer:

这篇关于JFrame GridBagLayout组件定位的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-17 17:40
查看更多