1

こんにちは、テーブル設定のコードは次のとおりです。

String [] column = {"MacAddress","PcName","OperatingSystem","IpAddress","Port","Status"};
    model = new DefaultTableModel(0,column.length);
    model.setColumnIdentifiers(column);
    mainTable = new JTable(model);
    mainTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    for(int i=0;i<=column.length-1;i++){
    mainTable.getColumnModel().getColumn(i).setPreferredWidth(300);
    }
    pane = new JScrollPane(mainTable);
    pnlTabel = new JPanel();
    pnlTabel.setBorder(BorderFactory.createTitledBorder(""));
    pnlTabel.setPreferredSize(new Dimension(dim.width*70/100, dim.height*60/100));
    pnlTabel.add(pane);
addMainPanel(pnlTabel);

ここに私の addMainPanel() 関数があります:

public void addMainPanel(Component pnl){
    mainPanel.add(pnl);
    mainPanel.revalidate();
}

そして、これが私のmainPanelのコードです:

    mainPanel = new JPanel();
mainPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
add(mainPanel,"Center");

フレームにボーダーレイアウトを使用しています:

setLayout(new BorderLayout(0,0));

私の問題は、このコードのセットを使用して JTable を設定しても、このコードがすべて失敗するように見えることです:

 mainTable.setAutoResizeMode(JTa![enter image description here][1]ble.AUTO_RESIZE_OFF);
for(int i=0;i<=column.length-1;i++){
mainTable.getColumnModel().getColumn(i).setPreferredWidth(300);
}

そのコードを使用すると、私のjtableはサイズ変更されず、下部に水平スクロールバーが追加されるだけです。

4

2 に答える 2

5

不快感はありませんが、..あなたのコードとその結果としてのあなたの質問は混乱です;-)さらにあなたはあなたが何を達成したいのかを正確に説明していません。

ネストされたレイアウト/サイズ変更の特性を取得して、もつれを解こうとしています(スニペットに見られるように、完全ではない可能性があります):

frame // BorderLayout
   mainPanel // FlowLayout
       pnlTabel  // FlowLayout, hard-coded prefSize
           pane // scrollPane 
               mainTable // auto-resize-off

余談ですが、名前スキームの混合が全体的な混乱にどのように寄与するかを示すために、意図的に名前を伝えないようにしました:-)タイプ関連のマーカーを修正する前に決定するか後修正するかは重要ではありませんが、一貫している場合はそうです。

その階層には、基本的にそれぞれの設定で子をレイアウトし、それに応じて独自の設定を調整する2つのレベルのFlowLayoutがあります。ただし、設定がpnlTableのレベルでハードコーディングされないようにします。ただし、テーブルの設定は変更されます(によって列の設定を変更する)それ以上バブルすることはできません...設定のリードをハードコーディングすると、サイズが計算されません(layoutManagerとuiDelegateのどちらでも、どちらもそれを実行する機会がありません)

もう1つの問題-より興味深い問題:-)-は、JScrollPaneが

  • ビューがScrollableを実装しているかどうかに応じて、ビューのpref / scrollablePrefViewportSizeから独自のprefSizeを計算します(JTableはそうしますが、くだらない方法です)
  • 検証ルートであること:ビュー(または子)を無効にしても、階層がさらに上にバブルすることはありません

列のprefWidtsが変更された場合にテーブルのscrollPaneを大きくしたいとすると、微調整する必要がある2つのことがあります。

  • テーブルのgetPreferredScrollableWidthを実装して、列のprefWidthに基づいて計算された値を返します
  • 階層の上位にあるコンテナを再検証します

遊ぶためのいくつかのコード:

final JTable table = new JTable(50, 10) {
    // properties to base a reasonable prefScrollable size
    int visibleColumns = 3;
    int visibleRows = 10;
    // hard-coded default in super
    Dimension dummySuper = new Dimension(450, 400);
    @Override
    public Dimension getPreferredScrollableViewportSize() {
        Dimension dim =  super.getPreferredScrollableViewportSize();
        if (!dummySuper.equals(dim)) return dim;
        dim = new Dimension();
        for (int column = 0; column < Math.min(visibleColumns, getColumnCount()); column++) {
            dim.width += getColumnModel().getColumn(column).getPreferredWidth();
        }
        dim.height = visibleRows * getRowHeight();
        return dim;
    }

};
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
for (int i = 0; i < table.getRowCount(); i++) {
    table.setValueAt("row: " + i, i, 0);
}
JComponent tablePanel = new JPanel();
tablePanel.add(new JScrollPane(table));

Action sizeColumns = new AbstractAction("size columns") {
    int prefWidth = 75;
    @Override
    public void actionPerformed(ActionEvent e) {
        int newWidth = prefWidth + 15;
        for (int i = 0; i < table.getColumnCount(); i++) {
            if (table.getColumnModel().getColumn(i).getPreferredWidth() == prefWidth)
                table.getColumnModel().getColumn(i).setPreferredWidth(newWidth);
        }
        prefWidth = newWidth;
        // revalidate "higher up" than the table itself
        frame.revalidate();
    }
};
frame.add(new JButton(sizeColumns), BorderLayout.SOUTH);
于 2012-10-03T11:59:39.073 に答える
4

JTableで利用可能なスペースを埋めたい場合は、レイアウト マネージャーJPanelを持つ内に配置する必要があります。また、テーブルがビューに収まらない場合 (行が多すぎる場合など) にスクロールバーが表示されることをBorderLayout忘れないでください。JScrollPane

JFrame frame = new JFrame();
// set up frame

JTable table = new JTable();
// Set up table, add data

// Frame has a content pane with BorderLayout by default
frame.getContentPane().add( new JScrollPane( table ), BorderLayout.CENTER );

表以外に表示したいコンテンツがある場合は、それらをコンテンツ パネルの NORTH、SOUTH、EAST、WEST 部分に追加できます (さらにコンポーネントを配置する場合は、他のパネルにラップできます)。

于 2012-10-03T13:59:38.313 に答える