您的位置:首页 > 编程语言 > PHP开发

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

2013-08-07 19:43 1226 查看
(设计有点问题,已经更新为 : 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();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: