2つのJPanelsがGridLayout(13、11)に設定されたJTabbedPaneがあります。最初のJPanelには、空のセルを残すのに十分な数のセルが入力されています。
2番目のJPanelでは、埋められるセルが大幅に少なくなり、その結果、各ボタンが引き伸ばされて行全体が埋められます。
GridLayoutに空のセルを尊重させる方法があるので、両方のJPanelのボタンは同じサイズですか?
ネストされたレイアウトを使用して、目的の結果を取得します。一部のレイアウトはコンポーネントの推奨サイズを尊重し、一部は尊重しません。 GridLayout
はそうではないものの1つです。 this answer を見て、どれが実行し、どれが実行しないかを確認してください。
たとえば、GridLayout
nestedの13個のボタンを別のJPanel
にFlowLayout
でネストできます。
JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel p2 = new JPanel(new GridLayout(13, 1));
for (int i = 0; i < 13; i++) {
p2.add(new JButton("Button " + i));
}
p1.add(p2);
import Java.awt.FlowLayout;
import Java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Test6 {
public Test6() {
JPanel p1 = new JPanel(new FlowLayout(FlowLayout.LEADING));
JPanel p2 = new JPanel(new GridLayout(13, 1));
for (int i = 0; i < 13; i++) {
p2.add(new JButton("Button " + i));
}
p1.add(p2);
JFrame frame = new JFrame("Test Card");
frame.add(p1);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Test6 test = new Test6();
}
});
}
}
両方のJPanelのボタンが同じサイズになるようにGridLayoutに空のセルを尊重させる方法はありますか?
それは確かにGridLayout
で実行可能であり、テキストのないJLabel
で空白の正方形を単に「埋める」。
例えば。これが2つのグリッドレイアウトで、どちらも3行に埋め込まれています。
import Java.awt.*;
import Java.awt.image.BufferedImage;
import Java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.LineBorder;
class FillGridLayout {
public static final JComponent getPaddedGrid(
ArrayList<BufferedImage> images, int width, int height) {
JPanel p = new JPanel(new GridLayout(height, width, 2, 2));
p.setBorder(new LineBorder(Color.RED));
int count = 0;
for (BufferedImage bi : images) {
p.add(new JButton(new ImageIcon(bi)));
count++;
}
for (int ii=count; ii<width*height; ii++ ) {
// add invisible component
p.add(new JLabel());
}
return p;
}
public static void main(String[] args) {
final ArrayList<BufferedImage> images = new ArrayList<BufferedImage>();
int s = 16;
for (int ii = s/4; ii < s; ii+=s/4) {
images.add(new BufferedImage(ii, s, BufferedImage.TYPE_INT_RGB));
images.add(new BufferedImage(s, ii, BufferedImage.TYPE_INT_RGB));
}
Runnable r = new Runnable() {
@Override
public void run() {
JPanel gui = new JPanel(new BorderLayout(3,3));
gui.add(getPaddedGrid(images, 3, 3), BorderLayout.LINE_START);
gui.add(getPaddedGrid(images, 4, 3), BorderLayout.LINE_END);
JOptionPane.showMessageDialog(null, gui);
}
};
// Swing GUIs should be created and updated on the EDT
// http://docs.Oracle.com/javase/tutorial/uiswing/concurrency
SwingUtilities.invokeLater(r);
}
}