JFrame 内には JTabbedPane しかありません。JTabbedPane は、その寸法を最大のページ幅/高さに設定します。ページのサイズが異なるため、他のページを選択するときに JTabbedPane のサイズを強制的に変更することはできますか?
上の 1 つは現在の動作であり、下の 1 つはどのように動作するかです (手動でフレームのサイズを変更しました)。
JFrame 内には JTabbedPane しかありません。JTabbedPane は、その寸法を最大のページ幅/高さに設定します。ページのサイズが異なるため、他のページを選択するときに JTabbedPane のサイズを強制的に変更することはできますか?
上の 1 つは現在の動作であり、下の 1 つはどのように動作するかです (手動でフレームのサイズを変更しました)。
これはかなり単純です。これには、ページのサイズの差を動的に計算し、それらを使用して優先サイズを強制することが含まれますJTabbedPane
。簡単な実験を行ったところ、うまくいきました。したがって、ここに多くのテキストを配置する代わりに、ここにコードを示します。完璧ではありませんが、アイデアを得る必要があります。もちろん、質問も大歓迎です。
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class Test {
private static int maxW = 0;
private static int maxH = 0;
public static void main(String[] args) {
final JFrame f = new JFrame();
final JTabbedPane tabs = new JTabbedPane();
tabs.add( createPanel(Color.RED, 100, 100), "Red");
tabs.add( createPanel(Color.GREEN, 200, 200), "Green");
tabs.add( createPanel(Color.BLUE, 300, 300), "Blue");
final Dimension originalTabsDim = tabs.getPreferredSize();
tabs.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Component p = ((JTabbedPane) e.getSource()).getSelectedComponent();
Dimension panelDim = p.getPreferredSize();
Dimension nd = new Dimension(
originalTabsDim.width - ( maxW - panelDim.width),
originalTabsDim.height - ( maxH - panelDim.height) );
tabs.setPreferredSize(nd);
f.pack();
}
});
f.setContentPane(tabs);
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
private static final JPanel createPanel( Color color, int w, int h ) {
JPanel p = new JPanel();
p.setBackground(color);
p.setPreferredSize( new Dimension(w, h));
maxW = Math.max(w, maxW);
maxH = Math.max(h, maxH);
return p;
}
}
別のオプションは、タブが選択されたときに各タブのパネルを動的に変更することだと思います:
JTabbedPane
選択時にリスナーをインストールするpack()
を含むウィンドウ/ダイアログで呼び出すJTabbedPane
免責事項:このアプローチはテストしていませんが、必要に応じて機能するはずです。
また、選択したタブに基づいてダイアログのサイズを動的に変更することは、純粋な GUI の観点からはあまりユーザーフレンドリーではないことに注意してください。
これはどう?
tabbedPane.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent arg0) {
Component mCompo=tabbedPane.getSelectedComponent();
tabbedPane.setPreferredSize(mCompo.getPreferredSize());
BasicFrame.this.pack();
}
});