2017-04-15 9 views
0

私はGUIを正しく表示しています。 TitledBorder( "数値タイプ")は、右のJPanelのタイトル全体を表示しません。私はBorderLayout Managerと関係があると信じています。ボーダー内に「Numeric Type」と表示する代わりに、「Numeric ...」と表示されます。どんな助けでも大歓迎です。TitledBorderのタイトルをGUIで正しく表示するには

public class P3GUI extends JFrame { 

    private JLabel originalList; 
    private JTextField originalSort; 
    private JLabel sortedList; 
    private JTextField newSort; 
    private JPanel panel; 
    private JButton performSort; 
    private JRadioButton ascending; 
    private JRadioButton descending; 
    private ButtonGroup sort; 
    private JRadioButton integer; 
    private JRadioButton fraction; 
    private ButtonGroup numType; 
    private JPanel inputPanel, outputPanel, calculatePanel, radioPanel; 
    private JPanel left, right; 

    public P3GUI() { 
     super("Binary Search Tree Sort"); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     originalList = new JLabel("Original List"); 
     originalSort = new JTextField(20);   
     inputPanel = new JPanel(); 
     inputPanel.add(originalList); 
     inputPanel.add(originalSort); 
     sortedList = new JLabel("Sorted List"); 
     newSort = new JTextField(20); 
     newSort.setEditable(false); 
     outputPanel = new JPanel(); 
     outputPanel.add(sortedList); 
     outputPanel.add(newSort); 
     panel = new JPanel(); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     panel.add(inputPanel); 
     panel.add(outputPanel); 
     add(panel, BorderLayout.NORTH); 
     performSort = new JButton("Perform Sort"); 
     calculatePanel = new JPanel(); 
     calculatePanel.add(performSort); 
     add(calculatePanel, BorderLayout.CENTER);   
     ascending = new JRadioButton("Ascending"); 
     descending = new JRadioButton("Descending"); 
     sort = new ButtonGroup(); 
     sort.add(ascending); 
     sort.add(descending); 
     integer = new JRadioButton("Integer"); 
     fraction = new JRadioButton("Fraction"); 
     numType = new ButtonGroup(); 
     numType.add(integer); 
     numType.add(fraction); 
     radioPanel = new JPanel(); 
     radioPanel.setLayout(new FlowLayout()); 
     left = new JPanel(); 
     left.setLayout(new GridLayout(2,1)); 
     left.setBorder(BorderFactory.createTitledBorder("Sort Order")); 
     left.add(ascending); 
     left.add(descending); 
     right = new JPanel(); 
     right.setLayout(new GridLayout(2,1)); 
     right.setBorder(BorderFactory.createTitledBorder("Numeric Type")); 
     right.add(integer); 
     right.add(fraction); 
     radioPanel.add(left); 
     radioPanel.add(right); 
     add(radioPanel, BorderLayout.SOUTH);   
     pack(); 

    } 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new P3GUI().setVisible(true); 
      } 
     }); 
    } 

} 
+0

回答は編集を参照してください。 –

答えて

2

問題は、右のJPanelが全体のタイトルを表示するには小さすぎる、そしてそれが切り捨てられていることです。私は下部の2つのJPanelsをGridLayoutを使用する別のものに配置し、それらをGUIの下部に収まるように配置することをお勧めします。広がると、タイトルは完全に表示される可能性がさらに高くなります(ただし、保証はできません)。あなたがメインのGUIがBorderLayoutを使用し、BorderLayout.CENTER位置にJPanelを使用して、このGridLayout追加作れば

例えば、それは完全にそれを記入します。次に、上位のコンポーネントTextFieldJButtonは、別のJPanelに追加することができます。たとえば、GridBagLayoutを使用し、それをメインのJPanelBorderLayout.PAGE_STARTの位置に追加します。例えば

、次のコードは、このGUIを生成します。

enter image description here

enter image description here

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.Insets; 
import java.awt.event.KeyEvent; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class P3GUI2 extends JPanel { 
    private static final int COLS = 20; 
    private JTextField originalSort = new JTextField(COLS); 
    private JTextField newSort = new JTextField(COLS); 
    private JButton performSort = new JButton("Perform Sort"); 
    private JRadioButton ascending = new JRadioButton("Ascending"); 
    private JRadioButton descending = new JRadioButton("Descending"); 
    private ButtonGroup sort = new ButtonGroup(); 
    private JRadioButton integer = new JRadioButton("Integer"); 
    private JRadioButton fraction = new JRadioButton("Fraction"); 
    private ButtonGroup numType = new ButtonGroup(); 

    public P3GUI2() { 
     JPanel topPanel = new JPanel(new GridBagLayout()); 
     topPanel.add(new JLabel("Original List:"), createGbc(0, 0)); 
     topPanel.add(originalSort, createGbc(1, 0)); 
     topPanel.add(new JLabel("Sorted List:"), createGbc(0, 1)); 
     topPanel.add(newSort, createGbc(1, 1)); 

     performSort.setMnemonic(KeyEvent.VK_P); 
     JPanel btnPanel = new JPanel(); 
     btnPanel.add(performSort); 

     JPanel sortOrderPanel = createTitlePanel("Sort Order"); 
     JPanel numericPanel = createTitlePanel("Numeric Type"); 

     sortOrderPanel.add(ascending); 
     sortOrderPanel.add(descending); 
     sort.add(ascending); 
     sort.add(descending); 

     numericPanel.add(integer); 
     numericPanel.add(fraction); 
     numType.add(integer); 
     numType.add(fraction); 

     JPanel radioPanels = new JPanel(new GridLayout(1, 0, 3, 3)); 
     radioPanels.add(sortOrderPanel); 
     radioPanels.add(numericPanel);   

     setBorder(BorderFactory.createEmptyBorder(3, 3, 3, 3)); 
     setLayout(new BorderLayout(3, 3)); 
     add(topPanel, BorderLayout.PAGE_START); 
     add(btnPanel, BorderLayout.CENTER); 
     add(radioPanels, BorderLayout.PAGE_END); 
    } 

    private JPanel createTitlePanel(String title) { 
     JPanel panel = new JPanel(new GridLayout(0, 1, 3, 3)); 
     panel.setBorder(BorderFactory.createTitledBorder(title)); 
     return panel; 
    } 

    private GridBagConstraints createGbc(int x, int y) { 
     GridBagConstraints gbc = new GridBagConstraints(); 
     gbc.gridx = x; 
     gbc.gridy = y; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.anchor = x == 0 ? GridBagConstraints.WEST : GridBagConstraints.EAST; 
     gbc.insets = new Insets(3, 3, 3, 3); 
     gbc.weightx = 1.0; 
     gbc.weighty = 1.0; 
     return gbc; 
    } 

    private static void createAndShowGui() { 
     P3GUI2 mainPanel = new P3GUI2(); 

     JFrame frame = new JFrame("Binary Search Tree Sort"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 

それとも、メイン1 BorderLayout.CENTERに上記btnPanelを配置し、その後にradioPanelsを置くことができ主なものBorderLayout.PAGE_END。同じ外観のGUIが表示されますが、サイズを変更した場合は別の方法で拡張されます。

1

パネルの好ましいサイズ(レイアウトマネージャによって決定される)は、TitledBorderのテキストのサイズを考慮しないため、タイトルが切り捨てられる可能性があります。

ここには、TitleBorderで使用できるカスタムJPanelがあります。 getPreferredSize()方法は、最大幅を使用するようにカスタマイズされた:

  1. をデフォルトのgetPreferredSize()計算
  2. ここTitledBorderの

のテキストの幅は、単純な例である:

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

public class TitledBorderPanel extends JPanel 
{ 
    /** 
    ** The preferred width on the panel must consider the width of the text 
    ** used on the TitledBorder 
    */ 
    @Override 
    public Dimension getPreferredSize() 
    { 
     Dimension preferredSize = super.getPreferredSize(); 

     Border border = getBorder(); 
     int borderWidth = 0; 

     if (border instanceof TitledBorder) 
     { 
      Insets insets = getInsets(); 
      TitledBorder titledBorder = (TitledBorder)border; 
      borderWidth = titledBorder.getMinimumSize(this).width + insets.left + insets.right; 
     } 

     int preferredWidth = Math.max(preferredSize.width, borderWidth); 

     return new Dimension(preferredWidth, preferredSize.height); 
    } 

    private static void createAndShowGUI() 
    { 
     JPanel panel = new TitledBorderPanel(); 
     panel.setBorder(BorderFactory.createTitledBorder("File Options Command List:")); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     panel.add(new JLabel("Open")); 
     panel.add(new JLabel("Close")); 
//  panel.add(new JLabel("A really wierd file option longer than border title")); 

     JFrame frame = new JFrame("TitledBorderPanel"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 
+0

ありがとう、それは動作します! – dedek

関連する問題