我一直试图将Box中包含的按钮左移,但没有成功。
他们左对齐,但由于某种原因,不会像人们想象的那样一直向左移动。
我附上以下代码。请尝试编译并亲自查看。对我来说似乎很奇怪。
谢谢,Eric
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class MainGUI extends Box implements ActionListener{
//Create GUI Components
Box centerGUI=new Box(BoxLayout.X_AXIS);
Box bottomGUI=new Box(BoxLayout.X_AXIS);
//centerGUI subcomponents
JTextArea left=new JTextArea(), right=new JTextArea();
JScrollPane leftScrollPane = new JScrollPane(left), rightScrollPane = new JScrollPane(right);
//bottomGUI subcomponents
JButton encrypt=new JButton("Encrypt"), decrypt=new JButton("Decrypt"), close=new JButton("Close"), info=new JButton("Info");
//Create Menubar components
JMenuBar menubar=new JMenuBar();
JMenu fileMenu=new JMenu("File");
JMenuItem open=new JMenuItem("Open"), save=new JMenuItem("Save"), exit=new JMenuItem("Exit");
int returnVal =0;
public MainGUI(){
super(BoxLayout.Y_AXIS);
initCenterGUI();
initBottomGUI();
initFileMenu();
add(centerGUI);
add(bottomGUI);
addActionListeners();
}
private void addActionListeners() {
open.addActionListener(this);
save.addActionListener(this);
exit.addActionListener(this);
encrypt.addActionListener(this);
decrypt.addActionListener(this);
close.addActionListener(this);
info.addActionListener(this);
}
private void initFileMenu() {
fileMenu.add(open);
fileMenu.add(save);
fileMenu.add(exit);
menubar.add(fileMenu);
}
public void initCenterGUI(){
centerGUI.add(leftScrollPane);
centerGUI.add(rightScrollPane);
}
public void initBottomGUI(){
bottomGUI.setAlignmentX(LEFT_ALIGNMENT);
//setBorder(BorderFactory.createLineBorder(Color.BLACK));
bottomGUI.add(encrypt);
bottomGUI.add(decrypt);
bottomGUI.add(close);
bottomGUI.add(info);
}
@Override
public void actionPerformed(ActionEvent arg0) {
// find source of the action
Object source=arg0.getSource();
//if action is of such a type do the corresponding action
if(source==close){
kill();
}
else if(source==open){
//CHOOSE FILE
File file1 =chooseFile();
String input1=readToString(file1);
System.out.println(input1);
left.setText(input1);
}
else if(source==decrypt){
//decrypt everything in Right Panel and output in left panel
decrypt();
}
else if(source==encrypt){
//encrypt everything in left panel and output in right panel
encrypt();
}
else if(source==info){
//show contents of info file in right panel
doInfo();
}
else {
System.out.println("Error");
//throw new UnimplementedActionException();
}
}
private void doInfo() {
// TODO Auto-generated method stub
}
private void encrypt() {
// TODO Auto-generated method stub
}
private void decrypt() {
// TODO Auto-generated method stub
}
private String readToString(File file) {
FileReader fr = null;
try {
fr = new FileReader(file);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
BufferedReader br=new BufferedReader(fr);
String line = null;
try {
line = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
String input="";
while(line!=null){
input=input+"\n"+line;
try {
line=br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
return input;
}
private File chooseFile() {
//Create a file chooser
final JFileChooser fc = new JFileChooser();
returnVal = fc.showOpenDialog(fc);
return fc.getSelectedFile();
}
private void kill() {
System.exit(0);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
MainGUI test=new MainGUI();
JFrame f=new JFrame("Tester");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setJMenuBar(test.menubar);
f.setPreferredSize(new Dimension(600,400));
//f.setUndecorated(true);
f.add(test);
f.pack();
f.setVisible(true);
}
}
答案 0 :(得分:2)
不确定为什么按钮按照它们的方式对齐,但可能是因为它们试图与它上方的盒子对齐(我确信更精通Swing的人可以给你一个更好的答案)。调试布局问题的一种方便方法是突出显示带有彩色边框的组件,例如在您当前的代码中:
centerGUI.setBorder(BorderFactory.createLineBorder(Color.GREEN));
add(centerGUI);
bottomGUI.setBorder(BorderFactory.createLineBorder(Color.RED));
add(bottomGUI);
但是,如果我有这些要求,我会使用BorderLayout
,例如这个代码基于你的代码,我删除了不必要的部分,专注于布局部分(你应该在提问时这样做,它允许其他人更容易回答问题)
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class Tester {
private JPanel contentPanel;
private JTextArea leftTextArea = new JTextArea();
private JTextArea rightTextArea = new JTextArea();
private JMenuBar menuBar = new JMenuBar();
public Tester() {
initialisePanel();
initFileMenu();
}
public JPanel getContent() {
return contentPanel;
}
public JMenuBar getMenuBar() {
return menuBar;
}
private final void initialisePanel() {
contentPanel = new JPanel(new BorderLayout());
Box centreBox = new Box(BoxLayout.X_AXIS);
JScrollPane leftScrollPane = new JScrollPane(leftTextArea);
JScrollPane rightScrollPane = new JScrollPane(rightTextArea);
centreBox.add(leftScrollPane);
centreBox.add(rightScrollPane);
Box bottomBox = new Box(BoxLayout.X_AXIS);
bottomBox.add(new JButton(new SaveAction()));
bottomBox.add(new JButton(new ExitAction()));
contentPanel.add(centreBox, BorderLayout.CENTER);
contentPanel.add(bottomBox, BorderLayout.SOUTH);
}
private void initFileMenu() {
JMenu fileMenu = new JMenu("File");
fileMenu.add(new SaveAction());
fileMenu.add(new ExitAction());
menuBar.add(fileMenu);
}
class SaveAction extends AbstractAction {
public SaveAction() {
super("Save");
}
@Override
public void actionPerformed(ActionEvent e) {
handleSave();
}
}
void handleSave() {
System.out.println("Handle save");
}
class ExitAction extends AbstractAction {
public ExitAction() {
super("Exit");
}
@Override
public void actionPerformed(ActionEvent e) {
handleExit();
}
}
void handleExit() {
System.out.println("Exit selected");
System.exit(0);
}
public static void main(String[] args) {
Tester test = new Tester();
JFrame frame = new JFrame("Tester");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(test.getContent());
frame.setJMenuBar(test.getMenuBar());
frame.setPreferredSize(new Dimension(600, 400));
frame.pack();
frame.setVisible(true);
}
}
答案 1 :(得分:2)
阅读How to Use Box Layout上的Swing教程中的部分。它解释了(并且有一个例子)当组件具有不同的对齐时BoxLayout如何工作。
简单的解决方案是添加:
centerGUI.setAlignmentX(LEFT_ALIGNMENT);
答案 2 :(得分:0)
为什么不尝试使用MiGLayout?
他们有很多很棒的在线演示,包括很多不同的对齐示例。