【发布时间】:2014-10-16 18:51:51
【问题描述】:
我需要有关 java swing 布局的帮助。我想做任何类似的事情(请看图片):
我尝试放置网格包布局,但我无法插入内容为 10:00 的浮动 JPanel(在图像上)。谁能帮帮我?
【问题讨论】:
-
请出示您的minimal code attempt,让我们知道它对您不起作用。
标签: java swing gridbaglayout miglayout
我需要有关 java swing 布局的帮助。我想做任何类似的事情(请看图片):
我尝试放置网格包布局,但我无法插入内容为 10:00 的浮动 JPanel(在图像上)。谁能帮帮我?
【问题讨论】:
标签: java swing gridbaglayout miglayout
在大多数情况下,您通常需要考虑使用多种布局,但在您的情况下,GridBagLayout 应该能够实现您想要的基本布局
对于需要展开多列的组件,可以使用GridBagConstraints#gridwidth,同样,对于需要展开多行的组件GridBagConstraints#gridheight
作为一个整体,将你的布局要求分解为各个责任区域,例如,他们自己的记分卡有自己的布局要求,应该是自包含的组件,这将降低布局的复杂性。
更新
您可以在单个容器中进行(核心)布局,但这很容易破坏,相反,您应该尝试将 UI 分解为多个部分...
这是我看到的两个核心部分,其中有小节,但这是我开始的地方......
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class LayoutTest {
public static void main(String[] args) {
new LayoutTest();
}
public LayoutTest() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridheight = GridBagConstraints.REMAINDER;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(new ScoreCardsPane(), gbc);
gbc.gridx = 1;
add(new TimePane(), gbc);
}
}
public class TimePane extends JPanel {
public TimePane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
add(createScoreCard(), gbc);
gbc.gridx++;
add(createScoreCard(), gbc);
gbc.gridx = 0;
gbc.gridy = 2;
add(createScoreCard(), gbc);
gbc.gridx++;
add(createScoreCard(), gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.EAST;
gbc.gridwidth = 3;
add(new TimeCard(), gbc);
}
}
public class TimeCard extends JPanel {
public TimeCard() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
add(new JLabel("TEMPO"), gbc);
JLabel time = new JLabel("10:00");
time.setBorder(new LineBorder(Color.BLACK));
add(time, gbc);
}
}
public class ScoreCardsPane extends JPanel {
public ScoreCardsPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.anchor = GridBagConstraints.WEST;
JLabel topLabel = new JLabel("PONTOS");
add(topLabel, gbc);
JLabel bottomLabel = new JLabel("PONTOS");
gbc.gridy = 3;
add(bottomLabel, gbc);
gbc.anchor = GridBagConstraints.CENTER;
gbc.gridy = 1;
gbc.gridwidth = 1;
add(createScoreCard(), gbc);
gbc.gridx++;
add(createScoreCard(), gbc);
gbc.gridx++;
add(createScoreCard(), gbc);
gbc.gridy++;
gbc.gridx = 0;
add(createScoreCard(), gbc);
gbc.gridx++;
add(createScoreCard(), gbc);
gbc.gridx++;
add(createScoreCard(), gbc);
}
}
protected static JPanel createScoreCard() {
JPanel card = new JPanel() {
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
}
};
card.setBackground(Color.RED);
return card;
}
}
【讨论】: