JButton、JLabel 和 JTable 菜单布局问题



我正在尝试创建一个侧边菜单,该菜单顶部有一个小按钮,下面有两个不同大小的表格(第一个在第二个上方),然后在其下方有两个JLabels(同样,第一个JLabel在另一个之上)。

<Button>
<Table1>
<Table2>
<Label1>
<Label2>

我遇到的问题是,无论我使用哪种布局,其中一个组件都会遇到某种麻烦,例如表格弄乱,按钮扩展以填充整行,无法移动 JLabel。 我应该为我想要的菜单使用什么布局?

这是我当前代码的副本:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class Hello{
final Object[][] data = new Object[7][6];
String[] columnNames = {"Player", "Taxi", "Bus", "Undrgrd", "Secret", "Double"};
String[] mrXcolumns = {"Move","Transport"};
final Object[][] mrXdata = new Object[24][2];
final JFrame w = new JFrame();
int whosGo;
int roundNumber;
public static void main(String[] args) {
Hello hello = new Hello();
hello.run();
}
@SuppressWarnings("static-access")
public void run()
{
JPanel sidepanel = new JPanel(new BorderLayout());
JButton newgame = new JButton("New Game");          
JTable ticketTable = new JTable( data, columnNames );
JScrollPane ticketView = new JScrollPane( ticketTable );
ticketView.setBounds(25,50,300,150);
JTable mrXTable = new JTable(mrXdata, mrXcolumns);
JScrollPane moveView = new JScrollPane( mrXTable );
moveView.setBounds(25,210,300,400);
JLabel turn = new JLabel("Detective "+whosGo+"'s go");
JLabel round = new JLabel("ROUND: " +roundNumber);
sidepanel.setBounds(1018,0,382,809);
sidepanel.setBackground(Color.GREEN);
sidepanel.add(newgame);
sidepanel.add(ticketView);
sidepanel.add(moveView);
sidepanel.add(turn);
sidepanel.add(round);
w.add(sidepanel);
w.setDefaultCloseOperation(w.EXIT_ON_CLOSE);
w.setPreferredSize(new Dimension(1400,809));
w.setLayout(null);
w.pack();
w.setLocationByPlatform(true);
w.setVisible(true);
}

}

根据所需的结果,有许多可能的方法可以实现此目的。

你可以...

使用允许您将组件添加到单个列中的GridLayout。 这样做的缺点是每个组件的宽度将是父容器的宽度,并且每个组件将获得相等的高度(在组件之间分配);

sidepanel.setLayout(new GridLayout(0, 1));
sidepanel.add(newgame);
sidepanel.add(ticketView);
sidepanel.add(moveView);
sidepanel.add(turn);
sidepanel.add(round);

你可以...

使用允许您控制组件如何填充该列的GridBagLayout

sidepanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
// One component per row...
gbc.gridwidth = GridBagConstraints.REMAINDER;
// Fill the available column space, this does not mean
// fill to fit the available parent container width though
gbc.fill = GridBagConstraints.HORIZONTAL;
sidepanel.add(newgame, gbc);
sidepanel.add(ticketView, gbc);
sidepanel.add(moveView, gbc);
sidepanel.add(turn, gbc);
sidepanel.add(round, gbc);

这样做的缺点是,默认情况下,GridBagLayout会将其所有组件与容器的中心位置对齐。 你可以使用一些技巧来改变这一点,但它有点混乱

你可以...

使用 SwingX 库中的VertcialLayout

最新更新