2016-10-13 9 views
1

OK私のニーズに合わせて、下のリンクから既存の回答を修正しようとしています。私の場合、JTabbedPane.TOPを設定する必要がありますが、ボタンは消えます。JTabbedPaneのタブの右側にコンポーネントを配置します。

私はあまりにもスイングに精通していないので、誰かが私に知らせてください。以下はリンクからの完全なコード例です。

How to place components beneath tabs in right oriented JTabbedPane

public class RightTabPaneButtonPanel { 

    public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
     new RightTabPaneButtonPanel().makeUI(); 
     } 
    }); 
    } 



    public void makeUI() { 
     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.setTabPlacement(JTabbedPane.TOP); 
     JPanel panel = new JPanel(new GridLayout(1, 0)); 

    for (int i = 0; i < 3; i++) { 
     JPanel tab = new JPanel(); 
     tab.setName("tab" + (i + 1)); 
     tab.setPreferredSize(new Dimension(400, 400)); 
     tabbedPane.add(tab); 

     JButton button = new JButton("B" + (i + 1)); 
     button.setMargin(new Insets(0, 0, 0, 0)); 
     panel.add(button); 
    } 

    JFrame frame = new JFrame(); 
    frame.add(tabbedPane); 
    frame.pack(); 
    Rectangle tabBounds = tabbedPane.getBoundsAt(0); 

    Container glassPane = (Container) frame.getGlassPane(); 
    glassPane.setVisible(true); 
    glassPane.setLayout(new GridBagLayout()); 
    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.weightx = 1.0; 
    gbc.weighty = 1.0; 
    gbc.fill = GridBagConstraints.NONE; 
    int margin = tabbedPane.getWidth() - (tabBounds.x + tabBounds.width); 
    gbc.insets = new Insets(0, 0, 0, margin); 
    gbc.anchor = GridBagConstraints.SOUTHEAST; 

    panel.setPreferredSize(new Dimension((int) tabBounds.getWidth() - margin, 
      panel.getPreferredSize().height)); 
    glassPane.add(panel, gbc); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    frame.setVisible(true); 
    } 
} 
+0

はあなたのそのDimensionオブジェクトをプリントアウトしてみ'panel.setPreferredSize'に渡してください。 – VGR

+0

ボタンパネルはどこにありますか?北東? – ArcticLord

+0

NORTHEASTです。ボタンをちょう​​ど右揃えにしてください。 – Marquinio

答えて

1

私はこれが何をしたいと思い:ここ

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.weightx = 1.0; 
gbc.weighty = 1.0; 
gbc.fill = GridBagConstraints.NONE; 
gbc.anchor = GridBagConstraints.NORTHEAST; 
panel.setPreferredSize(new Dimension(panel.getPreferredSize().width, 
      (int) tabBounds.getHeight())); 
glassPane.add(panel, gbc); 
+0

よろしくお願いいたします。私はそれらの変更を行い、働いた。 – Marquinio

2

OverlayLayoutを使用したアプローチである:

import java.awt.*; 
import javax.swing.*; 
import javax.swing.plaf.*; 

public class TabbedPaneWithComponent 
{ 
    private static void createAndShowUI() 
    { 
     JPanel panel = new JPanel(); 
     panel.setLayout(new OverlayLayout(panel)); 

     JTabbedPane tabbedPane = new JTabbedPane(); 
     tabbedPane.add("1", new JTextField("one")); 
     tabbedPane.add("2", new JTextField("two")); 
     tabbedPane.setAlignmentX(1.0f); 
     tabbedPane.setAlignmentY(0.0f); 

     JCheckBox checkBox = new JCheckBox("Check Me"); 
     checkBox.setOpaque(false); 
     checkBox.setAlignmentX(1.0f); 
     checkBox.setAlignmentY(0.0f); 

     JPanel right = new JPanel(new FlowLayout(FlowLayout.RIGHT, 5, 0)); 
     right.setOpaque(false); 
     right.setAlignmentX(1.0f); 
     right.setAlignmentY(0.0f); 
     right.add(new JCheckBox("Check Me")); 
     right.add(new JCheckBox("Or Check Me")); 
     right.setMaximumSize(right.getPreferredSize()); 


     panel.add(checkBox); 
//  panel.add(right); 
     panel.add(tabbedPane); 

     JFrame frame = new JFrame("TabbedPane With Component"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setLocationByPlatform(true); 
     frame.setSize(400, 100); 
     frame.setVisible(true); 
     System.out.println(checkBox.getPreferredSize() + " : " + right.getPreferredSize()); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowUI(); 
      } 
     }); 
    } 
} 
+0

これは良いおかげです。私は、あなたがOverlayLayoutを使うことができたことを知りませんでした。私はOverlayLayoutがgetGlassPaneソリューションよりも好まれると思いますか? – Marquinio

+0

GlassPaneはGUI全体に影響します。この機能にGlassPaneを使用する場合は、他の用途には使用できません。通常、一時的な処理にはGlassPaneが使用されます。 [Glass Pane](http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html)を使用してフレームを一時的に無効にするSwingチュートリアルの例を参照してください。 OverlayLayoutはパネルとその子コンポーネントにのみ影響しますので、より良い解決策であることをお勧めします。 – camickr

関連する問題