OutputArea,用于模拟控制台输出信息的 Swing 控件

来源:互联网 发布:微信公众号开发java 编辑:程序博客网 时间:2024/06/05 06:08

(设计有点问题,已经更新为 : http://blog.csdn.net/raistlic/article/details/9833981)


一个自带了 Candy Strip Painting 的 OutputArea,它是个不能编辑的 JTextArea,用于输出信息,提供了友好的 getPrintStream() 方法,就是说,你可以方便的用 println, printf 等方法来输出信息。




import java.awt.BorderLayout;import java.awt.Color;import java.awt.FlowLayout;import java.awt.Graphics;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.ByteArrayOutputStream;import java.io.OutputStream;import java.io.PrintStream;import javax.swing.AbstractAction;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.SwingUtilities;import javax.swing.UIManager;public class OutputArea extends JTextArea {    public static void main(String[] args) {        SwingUtilities.invokeLater(new Runnable() {      public void run() {                try {                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());        }        catch (Exception e) {                    e.printStackTrace();        }                JFrame f = new JFrame("Test");                JPanel p = new JPanel(new BorderLayout());        final OutputArea a = new OutputArea();        a.setRows(30);        p.add(new JScrollPane(a));                p.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));                final JTextField field = new JTextField(100);        p.add(field, BorderLayout.SOUTH);                final PrintStream out = a.getPrintStream();        field.addActionListener(new ActionListener() {          public void actionPerformed(ActionEvent ae) {                        String s = field.getText();            field.setText("");            out.println(s);          }        });                JPanel control = new JPanel(new FlowLayout(FlowLayout.LEFT, 2, 2));        control.add(field);        control.add(new JButton(new AbstractAction("Clear") {          public void actionPerformed(ActionEvent ae) {                        a.setText("");          }        }));                p.add(control, BorderLayout.SOUTH);                f.setContentPane(p);        f.pack();        f.setMinimumSize(f.getSize());        f.setLocationRelativeTo(null);        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        f.setVisible(true);                field.requestFocusInWindow();      }    });  }    private final PrintStream ps;    private Color candy;    public OutputArea() {        ps = new PrintStream(this.new AreaOutputStream());    candy = new Color(230, 230, 255);    setOpaque(false);    setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 5));    setForeground(Color.GREEN.darker().darker().darker());  }    @Override  public final boolean isEditable() {        return false;  }    public PrintStream getPrintStream() {        return ps;  }    @Override  protected void paintComponent(Graphics g) {        int width = getWidth();    int height = getHeight();        Color old = g.getColor();    g.setColor(getBackground());    g.fillRect(0, 0, width, height);        Rectangle r = new Rectangle();    r.x = 0;    r.y = 0;    r.width = width;    r.height = getRowHeight();        g.setColor(candy);    for(int heightIncrement = 2 * getRowHeight();             r.y < height;             r.y += heightIncrement) {            g.fillRect(r.x, r.y, r.width, r.height);    }    g.setColor(old);        super.paintComponent(g);  }     private class AreaOutputStream extends OutputStream {        ByteArrayOutputStream out = new ByteArrayOutputStream();        @Override    public void write(int b) {            out.write(b);            if ('\n' == (char) b) {                append(out.toString());        out.reset();      }    }  }}




原创粉丝点击