2015-06-10 57 views
2

因此,我正在制作基于Java Swing GUI构建的数据库系统......我有一个按钮可用于将某人/某物添加到矢量中(在这种情况下数据库):将矢量打印到JTextArea时发生间距错误

// Database 
Vector<String> db = new Vector<String>(); 

这里是按钮的ActionListener的补充:

new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     String newStudent = student.getText(); 
     db.addElement(newStudent); 

这部分一切似乎却工作正常,当我使用去打印出来的载体上一个JTextArea字符串缓冲区,JTextArea文本中存在奇数间距问题

这里是StringBuffer的和部分在哪里打印矢量到JTextArea中:间距问题

StringBuffer dbb = new StringBuffer(); 
for (int i = 0; i < db.size(); i++) { 
    dbb.append(db.get(i) + '\n'); 
} 
// printDB is the JTextArea 
printDB.setText(dbb.toString()); 
    add(printDB); 

截图: Screenshot

上什么可能导致任何想法?间距似乎如果需要,是线性的,以及(1space,2spaces,3spaces ...)

  • 链接到整个项目(对不起,一般的差代码笑我只是开始):Full Code

  • 很抱歉,如果线是不正确的话顺便说一句我想不出另一种方式来描述它

代码:

import java.awt.*; 
import java.awt.event.*; 
import java.io.IOException; 
import java.util.*; 
import java.util.Vector.*; 
import javax.swing.*; 

public class Database extends JFrame implements ActionListener, EventListener { 

    // Database 
    Vector<String> db = new Vector<String>(); 

    // Main Menu Buttons: 
    JButton addStudent = new JButton("Add Student"); 
    JButton deleteStudent = new JButton("Delete Button"); 
    JButton deleteAll = new JButton("Delete All Students"); 
    JButton printAll = new JButton("Print Database"); 
    JTextArea welcome = new JTextArea("Welcome!"); 

    // Add Student Menu: 
    JTextField student = new JTextField(); 
    JButton submit = new JButton("Add Student"); 

    // Print Students 
    JTextArea printDB = new JTextArea(); 
    JButton returnMenu = new JButton("Return to Menu"); 

    public Database() { 
     super("DatabaseGUI"); 
     setSize(800, 600); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLayout(null); 
     setResizable(false); 
     welcome.setBackground(this.getForeground()); 
     add(welcome); 
     welcome.setSize(60, 15); 
     welcome.setLocation(386, 300); 
     add(addStudent); 
     addStudent.setSize(150, 50); 
     addStudent.setLocation(25, 100); 
     add(deleteStudent); 
     deleteStudent.setSize(150, 50); 
     deleteStudent.setLocation(625, 100); 
     add(deleteAll); 
     deleteAll.setLocation(225, 100); 
     deleteAll.setSize(150, 50); 
     add(printAll); 
     printAll.setLocation(425, 100); 
     printAll.setSize(150, 50); 
     addStudent.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      welcome.setVisible(false); 
      addStudent.setVisible(false); 
      deleteStudent.setVisible(false); 
      deleteAll.setVisible(false); 
      printAll.setVisible(false); 
      add(student); 
      add(submit); 
      submit.setVisible(true); 
      submit.setSize(150, 30); 
      submit.setLocation(425, 250); 
      student.setVisible(true); 
      student.setSize(150, 30); 
      student.setLocation(275, 250); 
      submit.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        String newStudent = student.getText(); 
        db.addElement(newStudent); 
        student.setText(null); 
        student.setVisible(false); 
        submit.setVisible(false); 
        welcome.setVisible(true); 
        addStudent.setVisible(true); 
        deleteStudent.setVisible(true); 
        deleteAll.setVisible(true); 
        printAll.setVisible(true); 
       } 
      }); 
     } 
     }); 
     printAll.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      welcome.setVisible(false); 
      addStudent.setVisible(false); 
      deleteStudent.setVisible(false); 
      deleteAll.setVisible(false); 
      printAll.setVisible(false); 
      StringBuffer dbb = new StringBuffer(); 
      for (int i = 0; i < db.size(); i++) { 
       dbb.append(db.get(i) + '\n'); 
      } 
      printDB.setText(dbb.toString()); 
      add(printDB); 
      printDB.setSize(300, 400); 
      printDB.setEditable(false); 
      printDB.setLocation(100, 100); 
      printDB.setVisible(true); 
      add(returnMenu); 
      returnMenu.setVisible(true); 
      returnMenu.setSize(200, 30); 
      returnMenu.setLocation(500, 400); 
      returnMenu.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        returnMenu.setVisible(false); 
        printDB.setVisible(false); 
        welcome.setVisible(true); 
        addStudent.setVisible(true); 
        deleteStudent.setVisible(true); 
        deleteAll.setVisible(true); 
        printAll.setVisible(true); 
       } 
      }); 
     } 
     }); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 
     Database student = new Database(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     // TODO Auto-generated method stub 

    } 

} 
+0

某些值是空'String's – MadProgrammer

+0

为了更好地帮助越早,张贴[MCVE](http://stackoverflow.com/help/ (最小完整可验证示例)或[SSCCE](http://www.sscce.org/)(简短的,独立的,正确的示例)。 –

回答

1

您在addStudent ActionListener内重复添加一个ActionListener,意思是按下addStudent,越来越多的ActionListeners将被添加到提交,这不是你想要的。

建议:

  • 只是一次添加一个ActionListener您Jbutton将,而不是内其它事件侦听器可以调用多次。考虑在你的类构造器中添加所有的ActionListener。

边区域经济共同体:

  • 不要使用绝对定位和空布局。虽然Swing的新手可能看起来像是创建复杂GUI的最简单也是最好的方式,但更多Swing GUI的创建使用它们时会遇到更严重的困难。它们不会在GUI大小调整时调整组件的大小,它们是增强或维护的皇室女巫,当它们放在滚动窗格中时它们会完全失败,在所有平台或屏幕分辨率与原始视图不同时,它们看起来会非常糟糕。
  • 了解如何使用CardLayout,然后使用CardLayout轻松更换您的视图。

例如,

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Font; 
import java.awt.GridLayout; 
import java.awt.Window; 
import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.*; 

@SuppressWarnings("serial") 
public class Database2 extends JPanel { 
    // constants for the cards 
    public static final String WELCOME = "welcome"; 
    public static final String ADD_STUDENT = "add student"; 
    public static final String DISPLAY_DATA = "display data"; 

    private JTextArea displayTextArea = new JTextArea(15, 20); 
    private JTextField addStudentField = new JTextField(10); 
    private CardLayout cardLayout = new CardLayout(); 
    private List<String> db = new ArrayList<>(); 

    public Database2() { 
     // prepare JTextArea 
     displayTextArea.setWrapStyleWord(true); 
     displayTextArea.setLineWrap(true); 
     displayTextArea.setFocusable(false); 

     // set layout as CardLayout and add all JPanels with constants 
     setLayout(cardLayout); 
     add(createWelcomePanel(), WELCOME); 
     add(createAddStudentPanel(), ADD_STUDENT); 
     add(createDisplayDataPanel(), DISPLAY_DATA); 
    } 

    private JPanel createWelcomePanel() { 
     ShowStudentPanelAction showStudentAction = new ShowStudentPanelAction("Add Student"); 
     DisplayDataAction displayDataAction = new DisplayDataAction("Display Data"); 
     JButton addStudentButton = new JButton(showStudentAction); 
     JButton displayDataButton = new JButton(displayDataAction); 

     JPanel topPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     topPanel.add(addStudentButton); 
     topPanel.add(displayDataButton); 
     topPanel.add(new JButton(new ExitAction("Exit", KeyEvent.VK_X))); 

     JLabel welcomeLabel = new JLabel("Welcome", SwingConstants.CENTER); 
     // make JLabel text bigger 
     welcomeLabel.setFont(welcomeLabel.getFont().deriveFont(Font.BOLD, 42f)); 

     // and give it a border 30 points wide 
     int ebGap = 30; 
     welcomeLabel.setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, 
      ebGap, ebGap)); 

     JPanel welcomePanel = new JPanel(new BorderLayout()); 
     ebGap = 4; 
     welcomePanel.setBorder(BorderFactory.createEmptyBorder(ebGap, ebGap, ebGap, ebGap)); 
     welcomePanel.add(topPanel, BorderLayout.PAGE_START); 
     welcomePanel.add(welcomeLabel, BorderLayout.CENTER); 

     return welcomePanel; 
    } 

    private JPanel createAddStudentPanel() { 
     AddStudentAction addStudentAction = new AddStudentAction("Add Student"); 
     addStudentField.setAction(addStudentAction); 
     JPanel addStudentPanel = new JPanel(); 
     addStudentPanel.add(addStudentField); 
     addStudentPanel.add(new JButton(addStudentAction)); 
     return addStudentPanel; 
    } 

    private JPanel createDisplayDataPanel() { 
     JPanel displayDataPanel = new JPanel(); 
     JScrollPane scrollPane = new JScrollPane(displayTextArea); 
     scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
     displayDataPanel.add(scrollPane); 
     displayDataPanel.add(new JButton(new ReturnToWelcomeAction("Return"))); 
     return displayDataPanel; 
    } 

    private class ShowStudentPanelAction extends AbstractAction { 
     public ShowStudentPanelAction(String name) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     cardLayout.show(Database2.this, ADD_STUDENT); 
     addStudentField.requestFocusInWindow(); 
     addStudentField.selectAll(); 
     } 
    } 

    private class DisplayDataAction extends AbstractAction { 
     public DisplayDataAction(String name) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     StringBuilder sb = new StringBuilder(); 
     for (String studentName : db) { 
      sb.append(studentName + "\n"); 
     } 
     displayTextArea.setText(sb.toString()); 
     cardLayout.show(Database2.this, DISPLAY_DATA); 
     } 
    } 

    private class AddStudentAction extends AbstractAction { 
     public AddStudentAction(String name) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     String studentText = addStudentField.getText(); 
     db.add(studentText); 
     cardLayout.show(Database2.this, WELCOME); 
     } 
    } 

    private class ReturnToWelcomeAction extends AbstractAction { 
     public ReturnToWelcomeAction(String name) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     cardLayout.show(Database2.this, WELCOME); 
     } 
    } 

    private class ExitAction extends AbstractAction { 
     public ExitAction(String name, int mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     Window window = SwingUtilities.getWindowAncestor(Database2.this); 
     if (window != null) { 
      window.dispose(); 
     } 
     } 
    } 

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

     JFrame frame = new JFrame("Database2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 
+0

我真的不明白我是如何为每个JButton添加多个actionlistener的。嵌套的actionlistener位于一个单独的按钮上,以便返回到临时菜单或向矢量提交某些东西 –

+0

@TreyTaylor:了解每次按下addStudent按钮时,都会调用其ActionListener。每次调用此侦听器时,都会向提交JButton添加一个** new ** ActionListener。这是如何令人困惑?同样简单的解决方案不是在addStudent的ActionListener中添加提交JButton的ActionListener。在其他ActionListener内部存在相同的问题。 –

+0

我现在明白了。对不起,我只是无法理解我每次调用嵌套在其中的按钮的ActionListener时是如何创建一个新的ActionListener的。非常感谢。 –