我如何在JPanel使用默认的FlowLayout中心的JButton ?



我正在尝试使用默认的FlowLayout在JPanel中居中JButton。下面是我的代码:

import javax.swing.*;
import java.awt.*;
public class CoinFlip {
public static void main(String[] args) {
JFrame frame = new JFrame("Coin Flip");
frame.setSize(500, 500);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton coinFlipButton = new JButton("Flip Coin");
coinFlipButton.setSize(100, 100);
JPanel coinFlipPanel = new JPanel();
coinFlipPanel.setSize(500, 100);
coinFlipPanel.setBackground(Color.GRAY);
coinFlipPanel.add(coinFlipButton);
JTextArea coinFlipResults = new JTextArea();
coinFlipResults.setSize(500, 200);
frame.getContentPane().add(coinFlipPanel);
frame.getContentPane().add(coinFlipResults);
frame.setVisible(true);
}
}

如何在JPanel (coinFlipPanel)中居中JButton (coinFlipButton) ?我试过使用FlowLayout。

我仔细检查了文档和FlowLayout确实有一个选项来居中它的组件,所以我的错。但除此之外,你只需要阅读关于各种组件及其布局的教程,并进行一些实验。

非常重要的一点是,默认JFrame的jframe.getContentPane().add()使用只允许一个组件的布局。如果需要多个组件,则必须使用第二个组件,如具有Grid或Flow布局的JPanel。通过两次调用该方法,您只是替换了之前的组件。请阅读JFrames和BorderLayout的教程。

不管怎样,我做了一个快速的程序,可以做你想做的事情。我将文本区域添加到ScrollPane中,因为这是处理JFrame的主内容窗格的另一种方式。当我添加带有按钮的JPanel时,我将它添加到BorderLayout的SOUTH部分,因为那是你用BorderLayout显示多个组件的方式。(教程。)

public class JFrameBorderWithButton {
public static void main( String[] args ) {
SwingUtilities.invokeLater( JFrameBorderWithButton::newGui );
}
private static void newGui() {
JFrame frame = new JFrame();

JTextArea text = new JTextArea(5, 40);
JScrollPane scroll = new JScrollPane( text );
frame.add( scroll );
JPanel panel = new JPanel( new FlowLayout( FlowLayout.CENTER ) );
JButton button = new JButton( "Press Me" );
panel.add(  button );
frame.add( panel, BorderLayout.SOUTH );

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

根据我的经验,简单的布局很少是值得的。使用GridBagLayout

public static void main(String [] args) throws IOException {
JFrame frame = new JFrame("Coin Flip");
JTextArea textArea = new JTextArea();
JScrollPane textScroll = new JScrollPane(textArea);
Action flipAction = new AbstractAction("Flip Coin!") {
private Random random = new Random();

@Override
public void actionPerformed(ActionEvent e) {
if (!textArea.getText().isEmpty()) {
textArea.append(System.lineSeparator());
}

if (random.nextBoolean()) {
textArea.append("Heads!");
} else {
textArea.append("Tails!");
}
}
};

JButton flipButton = new JButton(flipAction);

frame.setLayout(new GridBagLayout());
frame.setPreferredSize(new Dimension(175, 500));
frame.add(flipButton, new GridBagConstraints(0, 0, 1, 1, 1.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL, new Insets(4, 4, 4, 4), 0, 0));
frame.add(textScroll, new GridBagConstraints(0, 1, 1, 3, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(4, 4, 4, 4), 0, 0));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

相关内容

  • 没有找到相关文章

最新更新