レイアウトがJTable
であるJPanel
にnull
を追加したい。 JPanel
には他のコンポーネントが含まれています。適切な位置にJTable
を追加する必要があります。
Javaチュートリアルには、レイアウトマネージャーの使用に関する包括的な情報があります。詳細については、 コンテナ内のコンポーネントのレイアウト レッスンを参照してください。
notではないレイアウトの1つの側面は、ネストされたレイアウトであり、1つのレイアウトを別のレイアウトに入れて複雑な効果を得ることができます。
次のコードは、さまざまなコンポーネントをフレームに入れて、ネストされたレイアウトの使用方法を示します。明示的に設定されたすべてのレイアウトは、それらが使用されているパネルのタイトル付きボーダーとして表示されます。
コードの注目すべき側面は次のとおりです。
import Java.awt.*;
import Java.awt.image.BufferedImage;
import Java.awt.event.ActionListener;
import Java.awt.event.ActionEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.border.TitledBorder;
/** A short example of a nested layout that can change PLAF at runtime.
The TitledBorder of each JPanel shows the layouts explicitly set.
@author Andrew Thompson
@version 2011-04-12 */
class NestedLayoutExample {
public static void main(String[] args) {
Runnable r = new Runnable() {
public void run() {
final JFrame frame = new JFrame("Nested Layout Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel gui = new JPanel(new BorderLayout(5,5));
gui.setBorder( new TitledBorder("BorderLayout(5,5)") );
//JToolBar tb = new JToolBar();
JPanel plafComponents = new JPanel(
new FlowLayout(FlowLayout.RIGHT, 3,3));
plafComponents.setBorder(
new TitledBorder("FlowLayout(FlowLayout.RIGHT, 3,3)") );
final UIManager.LookAndFeelInfo[] plafInfos =
UIManager.getInstalledLookAndFeels();
String[] plafNames = new String[plafInfos.length];
for (int ii=0; ii<plafInfos.length; ii++) {
plafNames[ii] = plafInfos[ii].getName();
}
final JComboBox plafChooser = new JComboBox(plafNames);
plafComponents.add(plafChooser);
final JCheckBox pack = new JCheckBox("Pack on PLAF change", true);
plafComponents.add(pack);
plafChooser.addActionListener( new ActionListener(){
public void actionPerformed(ActionEvent ae) {
int index = plafChooser.getSelectedIndex();
try {
UIManager.setLookAndFeel(
plafInfos[index].getClassName() );
SwingUtilities.updateComponentTreeUI(frame);
if (pack.isSelected()) {
frame.pack();
frame.setMinimumSize(frame.getSize());
}
} catch(Exception e) {
e.printStackTrace();
}
}
} );
gui.add(plafComponents, BorderLayout.NORTH);
JPanel dynamicLabels = new JPanel(new BorderLayout(4,4));
dynamicLabels.setBorder(
new TitledBorder("BorderLayout(4,4)") );
gui.add(dynamicLabels, BorderLayout.WEST);
final JPanel labels = new JPanel(new GridLayout(0,2,3,3));
labels.setBorder(
new TitledBorder("GridLayout(0,2,3,3)") );
JButton addNew = new JButton("Add Another Label");
dynamicLabels.add( addNew, BorderLayout.NORTH );
addNew.addActionListener( new ActionListener(){
private int labelCount = 0;
public void actionPerformed(ActionEvent ae) {
labels.add( new JLabel("Label " + ++labelCount) );
frame.validate();
}
} );
dynamicLabels.add( new JScrollPane(labels), BorderLayout.CENTER );
String[] header = {"Name", "Value"};
String[] a = new String[0];
String[] names = System.getProperties().
stringPropertyNames().toArray(a);
String[][] data = new String[names.length][2];
for (int ii=0; ii<names.length; ii++) {
data[ii][0] = names[ii];
data[ii][1] = System.getProperty(names[ii]);
}
DefaultTableModel model = new DefaultTableModel(data, header);
JTable table = new JTable(model);
try {
// 1.6+
table.setAutoCreateRowSorter(true);
} catch(Exception continuewithNoSort) {
}
JScrollPane tableScroll = new JScrollPane(table);
Dimension tablePreferred = tableScroll.getPreferredSize();
tableScroll.setPreferredSize(
new Dimension(tablePreferred.width, tablePreferred.height/3) );
JPanel imagePanel = new JPanel(new GridBagLayout());
imagePanel.setBorder(
new TitledBorder("GridBagLayout()") );
BufferedImage bi = new BufferedImage(
200,200,BufferedImage.TYPE_INT_ARGB);
Graphics2D g = bi.createGraphics();
GradientPaint gp = new GradientPaint(
20f,20f,Color.red, 180f,180f,Color.yellow);
g.setPaint(gp);
g.fillRect(0,0,200,200);
ImageIcon ii = new ImageIcon(bi);
JLabel imageLabel = new JLabel(ii);
imagePanel.add( imageLabel, null );
JSplitPane splitPane = new JSplitPane(
JSplitPane.VERTICAL_SPLIT,
tableScroll,
new JScrollPane(imagePanel));
gui.add( splitPane, BorderLayout.CENTER );
frame.setContentPane(gui);
frame.pack();
frame.setLocationRelativeTo(null);
try {
// 1.6+
frame.setLocationByPlatform(true);
frame.setMinimumSize(frame.getSize());
} catch(Throwable ignoreAndContinue) {
}
frame.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}
Nullレイアウトを使用しないでください。 LayoutManagersの使用方法を学習します。
http://download.Oracle.com/javase/tutorial/uiswing/layout/using.html
LayoutManagerを使用すると、ウィンドウのサイズ変更や動的なコンポーネントカウントを適切に処理できます。彼らは最初は恐ろしいように見えるかもしれませんが、学ぶために努力する価値があります。
覚えているように、nullレイアウトは絶対位置を意味するため、JTableの左上隅の位置のXポイントを数えるのはかなり困難です。ただし、すべてのパネルコンポーネントを1つずつ使用する場合は、FlowLayout()マネージャーを次のように使用できます。
JPanel panel=new JPanel(new FlowLayout());
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
または、パネルを埋める必要がある場合は、GridLayout()を使用する必要があります...
int x=2,y=2;
JPanel panel=new JPanel(new GridLayout(y,x));
panel.add(new aComponent());
panel.add(new bComponent());
panel.add(new JTable());
幸運を
Nullレイアウトマネージャーを使用している場合は、常にコンポーネントの境界を設定する必要があります。それがあなたの場合の問題です。
ここで誰もが提案することを実行し、時間を節約できると信じているレイアウトマネージャーを使用してください。 @jzdの投稿にあるチュートリアルをご覧ください。
楽しんで、ボロ。
JTable
はJScrollPane
に追加する必要があり、実際にはJPanel
に追加する必要があります。
JPanel
にはレイアウトマネージャーが必要です。
コンポーネントのサイズの精度を気にしない場合は、純粋なBorderLayout
を使用して、FlowLayout
およびGridLayout
と組み合わせることができます。精度が必要な場合-jgoodies FormLayout
を使用します。
FormLayout
は本当にトリッキーなものですが、WindowBuilder
(Eclipseに組み込まれている)とそれが生成するコードを見て少し遊ぶことができます。複雑に見えるかもしれませんが、それは単なる無知です。
幸運を。
まず、BorderLayoutManager(new JPanel(new BorderLayout()))などのその他のレイアウトマネージャーを真剣に検討する必要があります。
また、ダイアログを設計するときは、レイアウトをネスト:別のJPanel内の1つのJPanel(BorderLayout内のGridLayoutなど)を使用できることを忘れないでください。注:「良い」ダイアログは適切にサイズ変更である必要があります。したがって、ユーザーがフレームのサイズを変更した場合、テーブルなどの情報オブジェクトを自動的に拡張し、JPanel背景の大きな領域を表示しません。これは、NullLayoutでは達成できないことです。
しかし、おそらくこの大きな世界のどこかで、NullLayoutが単なるものである場合があります。以下に例を示します。
import Java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
public class JTableInNullLayout
{
public static void main(String[] argv) throws Exception {
DefaultTableModel model = new DefaultTableModel(
new String[][] { { "a", "123"} , {"b", "456"} },
new String[] { "name", "value" } );
JTable t = new JTable(model);
JPanel panel = new JPanel(null);
JScrollPane scroll = new JScrollPane(t);
scroll.setBounds( 0, 20, 150, 100 ); // x, y, width, height
panel.add(scroll);
JFrame frame = new JFrame();
frame.add(panel);
frame.setPreferredSize( new Dimension(200,200));
frame.pack();
frame.setVisible(true);
}
}
コンポーネントに「null」レイアウトがある場合、レイアウトを自分で管理する必要があります。つまり、コンポーネントの子の寸法と位置を計算して、どこに描画するかを決定する必要があります。絶対に必要でない限り、かなり退屈です。
そのきめ細かな制御が本当に必要な場合は、UI配置を変更する前に、まずGridBagLayoutを試してください。
this.setTitle("Sample");
JPanel p = new JPanel(new BorderLayout());
WindowEvent we = new WindowEvent(this, WindowEvent.WINDOW_CLOSED);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
System.exit(0);
}
});
// Create columns names
String columnNames[] = { "FirstCol", "SecondCol",
"ThirdCol", "FourthCol" };
dataModel = new DefaultTableModel();
for (int col = 0; col < columnNames.length; col++) {
dataModel.addColumn(columnNames[col]);
}
// Create a new table instance
table = new JTable(dataModel);
table.setPreferredScrollableViewportSize(new Dimension(200, 120));
table.setFillsViewportHeight(true);
table.setShowGrid(true);
table.setAutoscrolls(true);
// Add the table to a scrolling pane
scrollPane = new JScrollPane(table,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scrollPane.setPreferredSize(new Dimension(700, 700));
JPanel jpResultPanel = new JPanel();
jpResultPanel.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(), "Result",
TitledBorder.CENTER, TitledBorder.TOP));
jpResultPanel.add(scrollPane);
add(jpResultPanel);
pack();
setSize(720, 720);
setVisible(true);
これを試して。
JFrame frame = new JFrame("Sample Frame");
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
DefaultTableModel dfm = new DefaultTableModel(data, columnNames);
JTable table = new JTable(dfm);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane);
frame.add(panel);
frame.setVisible(true);
テーブルモデルは要件に依存します
JPanel panel = new JPanel();
JTable table = new JTable(rowData, colData);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane, BorderLayout.CENTER);
panel.setSize(800, 150);
panel.add(table);
panel.setLocationRelativeTo(null);
panel.setVisible(true);
お役に立てれば。
次のコードを使用できます。 JTableをJPanelに追加します。
JPanel panel = new JPanel();
this.setContentPane(panel);
panel.setLayout(null);
String data[][] = {{"1.", "ABC"}, {"2.", "DEF"}, {"3.", "GHI" }};
String col[] = {"Sr. No", "Name"};
JTable table = new JTable(data,col);
table.setBounds(100, 100, 100, 80);
panel.add(table);
setVisible(true);
setSize(300,300);