【问题标题】:BorderLayout orientation边框布局方向
【发布时间】:2017-05-12 00:00:51
【问题描述】:

我正在尝试创建窗口的顶部按钮。当我尝试将带有按钮的面板添加到框架上的 JPanel 时,我有一个 JFrame 和一个带有不同按钮的 JPanel,它没有显示...挖掘并尝试找到解决方案,我意识到问题是当我使用 BorderLayout 面板上的按钮将方向设置为面板时。我认为这可能是我没有意识到的愚蠢但我没有发现任何这样的问题。

当我设置方向时,问题就在这里:

contentPanel.add(buttons,BorderLayout.PAGE_START);

如果我删除:

BorderLayout.PAGE_START

有效

这是我的框架:

package view;

import javax.swing.JFrame;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.CardLayout;
import java.awt.BorderLayout;

public class MainFrame extends JFrame{
 private JPanel contentPanel, layOutPanel;
 private CardLayout mainCardLayout;
 private BorderLayout borderLayout;
 private static MainFrame instance = null;
 private FrameButtonsPanel buttons;

private MainFrame(){
 setSize(1000,700);
 //setUndecorated(true);
 setLocationRelativeTo(null);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


 contentPanel = new JPanel();
 borderLayout = new BorderLayout();
 contentPanel.setLayout(borderLayout);
 add(contentPanel);

 buttons = new FrameButtonsPanel();
 buttons.setBackground(Color.red);
 contentPanel.add(buttons,BorderLayout.PAGE_START);

 /*layOutPanel = new JPanel();
 mainCardLayout = new CardLayout();
 layOutPanel.setLayout(mainCardLayout);
 layOutPanel.setBackground(Color.red);
 contentPanel.add(layOutPanel,BorderLayout.SOUTH);*/
}

 public static MainFrame getInstance(){
  if (instance == null){
   instance = new MainFrame();
  }
  return instance;
 }

  public static void main(String[] args) {
   MainFrame.getInstance().setVisible(true);
  }
 }

这是我的带有按钮的面板:

package view;

import javax.swing.JPanel;
import javax.swing.SpringLayout;
import javax.swing.Spring;
import javax.swing.JButton;
import javax.swing.JFrame;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

 public class FrameButtonsPanel extends JPanel{
 private Spring spring;
 private JButton iconify, maximize, close;

  public FrameButtonsPanel(){
   SpringLayout mySpring = new SpringLayout();
   setLayout(mySpring);

  iconify = new JButton("-");
  add(iconify);
  maximize = new JButton("O");
  add(maximize);
  close = new JButton("X");
  add(close);

  spring = Spring.constant(850,850,2000);


mySpring.putConstraint(SpringLayout.WEST,iconify,spring,SpringLayout.WEST,this);
mySpring.putConstraint(SpringLayout.WEST,maximize,3,SpringLayout.EAST,iconify);
mySpring.putConstraint(SpringLayout.WEST,close,3,SpringLayout.EAST,maximize);
mySpring.putConstraint(SpringLayout.EAST,this,3,SpringLayout.EAST,close);

iconifyWindow();
maximizeWindow();
closeWindow();
}

 private void iconifyWindow(){
  iconify.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent arg0) {
        MainFrame.getInstance().setExtendedState(JFrame.ICONIFIED);
     }
   });
 }

 private void maximizeWindow(){
  maximize.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
    if(MainFrame.getInstance().getExtendedState() == JFrame.MAXIMIZED_BOTH){
        MainFrame.getInstance().setExtendedState(JFrame.NORMAL);
    }else{
        MainFrame.getInstance().setExtendedState(JFrame.MAXIMIZED_BOTH);
    }
        }
     });
  }

private void closeWindow(){
  close.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent arg0) {
            System.exit(0);
        }
    });
 }
}

【问题讨论】:

    标签: java swing layout orientation border-layout


    【解决方案1】:

    我不知道您为什么要尝试使用 SpringLayout 来显示按钮。

    只需使用 JPanel 和右对齐的 FlowLayout

    阅读FlowLayout API,了解有关如何右对齐添加到面板的组件的更多信息。

    【讨论】:

    • 它解决了这个问题,知道为什么我不能用 spring-layout 做到这一点吗?我想在我正在创建的栏上添加更多组件,并且我认为 spring 会给我更多的自定义,无论如何我认为我可以使用 FlowLayout 解决它
    • @DarkCrow10,我相信您可以使用 SpringLayout 来实现。但是 SpringLayout 是一个复杂的布局管理器,有很多约束。您的代码不起作用,因为您的约束不正确。那么为什么在 FlowLayout 如此简单的情况下使用它。如果您想尝试 SpringLayout,请从 How to Use SpringLayout 上的 Swing 教程中的工作示例开始。
    猜你喜欢
    • 2014-07-09
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2016-04-16
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多