将矢量打印到JTextArea时出现间距错误

时间:2015-06-10 02:33:45

标签: java database swing vector stringbuffer

所以我正在努力建立一个基于Java Swing GUI构建的数据库系统......我有一个按钮可以将一个人/事物添加到一个向量(在本例中是数据库):

// 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

有关可能导致此问题的任何想法?间距似乎也是线性的(1个空间,2个空间,3个空间......)

  • 如果需要,链接到完整项目(对不起一般的错误代码大声笑我刚刚开始):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

   }

}

1 个答案:

答案 0 :(得分:1)

您正在addStudent ActionListener中重复向提交按钮添加一个ActionListener,这意味着当按下addStudent时,将添加越来越多的ActionListener来提交,这不是您想要的。

建议:

  • 只向您的JButtons添加一次ActionListener,而不是可以多次调用的其他事件侦听器。考虑在类构造函数中添加所有ActionListener。

Side recs:

  • 不要使用绝对定位和空布局。虽然null布局和setBounds()似乎是Swing新手,比如创建复杂GUI的最简单和最好的方法,但是你创建的Swing GUI越多,在使用它们时会遇到更严重的困难。当GUI调整大小时,它们不会调整组件的大小,它们是增强或维护的皇室女巫,当它们被放置在滚动窗格中时它们完全失败,当它们在所有平台上观看时或者与原始平台不同的屏幕分辨率时它们看起来很糟糕
  • 了解如何使用然后使用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();
         }
      });
   }
}