首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法让BorderLayout的东边、南边和西边更大?

有没有办法让BorderLayout的东边、南边和西边更大?
EN

Stack Overflow用户
提问于 2014-06-10 07:34:32
回答 1查看 1.1K关注 0票数 0

我一直在为元素周期表的GUI编写代码。我有一切看起来都很好,但是我已经添加到东,西和南边界的许多按钮(金属,非金属和稀土)有一个"...“作为按钮的文本,而不是像中心这样的元素符号(过渡金属)。这是因为当我执行frame.pack()时,东部、南部和西部的按钮被塞进了它们各自的边界。有没有办法让这些边框稍微大一点,这样按钮就不会那么塞满了,从而显示出它们想要的标题,而不是"..."?我尝试过更改框架大小和每个按钮的首选按钮大小(第14和137行),但pack()方法似乎覆盖了这一点。

代码语言:javascript
复制
public class TestLayout
{
 public static void main (String[] args)
 {          
      JFrame window = new JFrame();
      JPanel mainPanel = new JPanel();
      
      window.setTitle ("Panda Productions: Periodic Table");
      window.setSize(1700, 1200);
      window.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
      window.setContentPane(mainPanel);
      window.setResizable(false);
      
      JPanel toggle = new JPanel();
      toggle.setBorder(BorderFactory.createTitledBorder("Enable Subshell View:"));
      toggle.setPreferredSize(new Dimension(200, 100));
      JPanel legend = new JPanel();
      legend.setBorder(BorderFactory.createTitledBorder("Legend:"));
      JLabel programTitle = new JLabel("    Periodic Table of The Elements    ");
      programTitle.setFont(new Font("Century Gothic", Font.BOLD, 36));
      JLabel errorInfo = new JLabel("                                  Please Select/Search for an Element...");
      errorInfo.setFont(new Font("Century Gothic", Font.BOLD, 14));
      JLabel legendLabel = new JLabel();
      legendLabel.setText(convertToMultiline("<font color='fuchsia'>Pink = Noble Gas</font>  <html><font color='red'>Red = Alkali Metals</font>  <font color='blue'>Blue = Alkaline Earth</font>  <font color='Green'>Green = Transition Metal</font> \n<font color='yellow'>Yellow = Lanthanide/Actinide</font>  <font color='orange'>Orange = Metal</font>  <font color='gray'>Gray = Non-Metal</font>  <font color='purple'>Purple = Halogen</font>  <font color='aqua'>Cyan = Metalloid</font>"));
      JTextField elementInput = new JTextField ();
      JTextField atomicNumInput = new JTextField ();
      JCheckBox viewToggle = new JCheckBox();
      JButton searchButton1 = new JButton("Search for Name");
      JButton searchButton2 = new JButton("Search for Atomic #"); 
      
      BorderLayout border = new BorderLayout();
      
      BorderLayout topGrid = new BorderLayout();
      GridLayout bottomGrid = new GridLayout(1,3);
      
      JPanel transitionLegendPanel = new JPanel();
      BoxLayout transitionLegend = new BoxLayout(transitionLegendPanel, BoxLayout.Y_AXIS);
      
      JPanel userInputPanel = new JPanel();
      userInputPanel.setPreferredSize(new Dimension(320, 100));
      userInputPanel.setBorder(BorderFactory.createTitledBorder("Search by Element Name or Atomic #:"));
      GridLayout userInput = new GridLayout(2,2);
      
      JPanel titlePanel = new JPanel();
      BoxLayout titleLayout = new BoxLayout (titlePanel, BoxLayout.Y_AXIS);
      
      GridLayout metalsLayout = new GridLayout(7,2);
      GridLayout nonMetalsLayout = new GridLayout(7,6);
      GridLayout transitionMetalsLayout = new GridLayout(4,10);
      GridLayout lanthanidesLayout = new GridLayout(2,15);
      
      JPanel topGridPanel = new JPanel();
      JPanel bottomGridPanel = new JPanel();
      JPanel lanthanidesPanel = new JPanel();
      JPanel metalsPanel = new JPanel();
      JPanel nonMetalsPanel = new JPanel();
      JPanel transitionMetalsPanel = new JPanel();
 
      mainPanel.setLayout(border);
      topGridPanel.setLayout(topGrid);
      bottomGridPanel.setLayout(bottomGrid);
      mainPanel.add(topGridPanel, BorderLayout.NORTH);
      mainPanel.add(bottomGridPanel, BorderLayout.SOUTH);
      
      metalsPanel.setLayout(metalsLayout);
      nonMetalsPanel.setLayout(nonMetalsLayout);
      mainPanel.add(metalsPanel, BorderLayout.WEST);
      mainPanel.add(nonMetalsPanel, BorderLayout.EAST);

      transitionLegendPanel.setLayout(transitionLegend);
      mainPanel.add(transitionLegendPanel, BorderLayout.CENTER);
      
      userInputPanel.setLayout(userInput);
      titlePanel.setLayout(titleLayout);
      topGridPanel.add(userInputPanel, BorderLayout.WEST);
      topGridPanel.add(titlePanel, BorderLayout.CENTER);
      topGridPanel.add(toggle, BorderLayout.EAST);
      
      bottomGridPanel.add(new JLabel(""));
      lanthanidesPanel.setLayout(lanthanidesLayout);
      bottomGridPanel.add(lanthanidesPanel);
      bottomGridPanel.add(new JLabel(""));
      
      userInputPanel.add(elementInput);
      userInputPanel.add(searchButton1);
      userInputPanel.add(atomicNumInput);
      userInputPanel.add(searchButton2);
      
      titlePanel.add(programTitle);
      titlePanel.add(errorInfo);
      toggle.add(viewToggle);
      legend.add(legendLabel);
      transitionLegendPanel.add(legend);
      transitionLegendPanel.add(Box.createRigidArea(new Dimension(0,5)));
      transitionMetalsPanel.setLayout(transitionMetalsLayout);
      transitionLegendPanel.add(transitionMetalsPanel);
      
      BufferedReader reader = null;
      ElementsTest[] element = new ElementsTest[118];
      
      try {
           File file = new File("Elements.txt");
           reader = new BufferedReader(new FileReader(file));
           
           for (int counter = 0 ; counter < 118 ; counter++)
           {
                String name = reader.readLine();
                int atomicNum = counter + 1;
                String atomicWeight = reader.readLine();
                String elementSymbol = reader.readLine();
                String elementCharge = reader.readLine();
                String fullElectronConfig = reader.readLine();
                String shortElectronConfig = reader.readLine();
                String elementState = reader.readLine();
                String elementType = reader.readLine();
                String density = reader.readLine();
                String meltingPoint = reader.readLine();
                String boilingPoint = reader.readLine();
                String emptyLine = reader.readLine();
                
                element[counter] = new ElementsTest (name, atomicNum,  atomicWeight, elementSymbol, elementCharge, fullElectronConfig, shortElectronConfig, elementState, elementType, density, meltingPoint, boilingPoint);
           }
           
      } catch (IOException e) {
           e.printStackTrace();
      }             
      
      JButton[] buttonArray = new JButton[118];
      for (int i = 0 ; i < 118 ; i++)
      {
           buttonArray[i] = new JButton();
           buttonArray[i].setPreferredSize(new Dimension(10, 10));
      }
           
      for (int counter2 = 0 ; counter2 < 118 ; counter2++)
      {
           String currentSymbol = element[counter2].getElementSymbol();
           buttonArray[counter2].setText(currentSymbol);
           
           if (element[counter2].getElementType().equals("Metal"))
           {
               buttonArray[counter2].setBackground(Color.ORANGE);
               buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Non-Metal"))
           {
                buttonArray[counter2].setBackground(Color.GRAY);
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Noble Gas"))
           {
                buttonArray[counter2].setBackground(Color.PINK);
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Transition Metal"))
           {
                buttonArray[counter2].setBackground(new Color(17, 131, 14));
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Lanthanide"))
           {
                buttonArray[counter2].setBackground(Color.YELLOW);
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Alkali Metal"))
           {
                buttonArray[counter2].setBackground(Color.RED);
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Alkaline Earth Metal"))
           {
                buttonArray[counter2].setBackground(Color.BLUE);
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Halogen"))
           {
                buttonArray[counter2].setBackground(new Color(173, 91, 255));
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Metalloid"))
           {
                buttonArray[counter2].setBackground(Color.CYAN);
                buttonArray[counter2].setOpaque(true);
           }
           
           if (element[counter2].getElementType().equals("Actinide"))
           {
                buttonArray[counter2].setBackground(Color.YELLOW);
                buttonArray[counter2].setOpaque(true);
           }
           
           else {
                buttonArray[counter2].setOpaque(true);
           }
      }

      metalsPanel.add(buttonArray[0]);
      metalsPanel.add(new JButton(""));
      metalsPanel.add(buttonArray[2]);
      metalsPanel.add(buttonArray[3]);
      metalsPanel.add(buttonArray[10]);
      metalsPanel.add(buttonArray[11]);
      metalsPanel.add(buttonArray[18]);
      metalsPanel.add(buttonArray[19]);
      metalsPanel.add(buttonArray[36]);
      metalsPanel.add(buttonArray[37]);
      metalsPanel.add(buttonArray[54]);
      metalsPanel.add(buttonArray[55]);
      metalsPanel.add(buttonArray[86]);
      metalsPanel.add(buttonArray[87]);
      
      for (int x = 20 ; x < 30 ; x++)
      {
           transitionMetalsPanel.add(buttonArray[x]);
      }
      
      for (int x = 38 ; x < 48 ; x++)
      {
           transitionMetalsPanel.add(buttonArray[x]);
      }
      
      transitionMetalsPanel.add(new JButton("57-71"));
      
      for (int x = 71 ; x < 80 ; x++)
      {
           transitionMetalsPanel.add(buttonArray[x]);
      }
      
      transitionMetalsPanel.add(new JButton("89-103"));
      
      for (int x = 103 ; x < 112 ; x++)
      {
           transitionMetalsPanel.add(buttonArray[x]);
      }
      
      nonMetalsPanel.add(new JButton(""));
      nonMetalsPanel.add(new JButton(""));
      nonMetalsPanel.add(new JButton(""));
      nonMetalsPanel.add(new JButton(""));
      nonMetalsPanel.add(new JButton(""));
      nonMetalsPanel.add(buttonArray[1]);
      
      for (int x = 4 ; x < 10 ; x++)
      {
           nonMetalsPanel.add(buttonArray[x]);
      }
      
      for (int x = 12 ; x < 18 ; x++)
      {
           nonMetalsPanel.add(buttonArray[x]);
      }
      
      for (int x = 30 ; x < 36 ; x++)
      {
           nonMetalsPanel.add(buttonArray[x]);
      }
      
      for (int x = 48 ; x < 54 ; x++)
      {
           nonMetalsPanel.add(buttonArray[x]);
      }
      
      for (int x = 80 ; x < 86 ; x++)
      {
           nonMetalsPanel.add(buttonArray[x]);
      }
      
      for (int x = 112 ; x < 118 ; x++)
      {
           nonMetalsPanel.add(buttonArray[x]);
      }
      
      for (int x = 56 ; x < 71 ; x++)
      {
           lanthanidesPanel.add(buttonArray[x]);
      }
      
      for (int x = 88 ; x < 103 ; x++)
      {
           lanthanidesPanel.add(buttonArray[x]);
      }
      
                window.pack();
      window.setVisible (true);
 }
 
 public static String convertToMultiline(String orig)
 {
      return "<html>" + orig.replaceAll("\n", "<br>");
 }
}

当前GUI输出:

EN

回答 1

Stack Overflow用户

发布于 2014-06-10 08:18:31

NORTHSOUTHEASTWEST位置由组件的首选大小决定

最好的选择是首先避免与setPreferredSize打交道,让组件和布局管理器在那里工作。

如果您需要提供额外的填充,可以使用EmptyBorder或边框或布局管理器的组合,它们为您提供了指定填充的能力,如GridBagLayout (用于最好的控制量)

此外,请避免在窗口上使用setSize,而应使用pack,并允许布局管理器根据组件、字体和其他渲染管道的详细信息来计算窗口的首选大小

例如..。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24130677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档