2012-09-30 14:12:39Morris
[JAVA視窗設計][作業] 小畫家-第一階段布局
1、功能描述:
1. Layout(工具區、畫布區、狀態列)
2. 利用Combo Box實做選擇繪圖工具(筆刷、直線、橢圓形、矩形、圓角矩形)
3. 利用Radio Button實做選擇筆刷大小(大、中、小)
4. 利用Check Box 實做選擇是否填滿
5. 實做Button(前景色、背景色、清除畫面
尤 6. 游標位置偵測(在狀態列顯示X, Y座標)
7. 實做繪圖工具、筆刷大小、是否填滿、按鈕的Action Listener(點選後會跳出訊息視窗,顯示被點選物件的名字)
室友作業, 拿來玩玩也不錯 ?!
善用訊息視窗
JOptionPane.showMessageDialog(null, "你點選了:" + s, "訊息", JOptionPane.INFORMATION_MESSAGE);
還傻傻的跑去寫一個介面出來, 我真的傻了
Demo 影片
先前的版本好像太零亂了, 因此我改一下
package paintFrame;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;
public class pFrame extends JFrame {
JLabel stateText = new JLabel("游標位置 : 畫布區外");
JPanel toolPanel = new JPanel();
Color[][] board = new Color[700][750];
Color using = Color.black;
MsgListener listener = new MsgListener();
public pFrame() {
this.setTitle("小畫家");
this.setSize(700, 760);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLayout(new BorderLayout());
this.setResizable(false);
stateText.setFont(new Font("", Font.PLAIN, 16));
toolPanel.setLayout(new GridLayout(11, 1));
add(stateText, BorderLayout.SOUTH);
add(toolPanel, BorderLayout.WEST);
JLabel drawTool = new JLabel("[繪圖工具]");
JLabel brushSize = new JLabel("[筆刷大小]");
String[] items = { "筆刷", "直線", "橢圓形", "矩形", "圓角矩形" };
JComboBox toolBox = new JComboBox(items);
toolBox.addItemListener(new BoxListener());
toolPanel.add(drawTool);
toolPanel.add(toolBox);
toolPanel.add(brushSize);
JRadioButton smallSize = new JRadioButton("小");
JRadioButton mediumSize = new JRadioButton("中");
JRadioButton largerSize = new JRadioButton("大");
ButtonGroup sizeGroup = new ButtonGroup();
smallSize.addActionListener(listener);
mediumSize.addActionListener(listener);
largerSize.addActionListener(listener);
smallSize.setSelected(true);
toolPanel.add(smallSize);
toolPanel.add(mediumSize);
toolPanel.add(largerSize);
sizeGroup.add(smallSize);
sizeGroup.add(mediumSize);
sizeGroup.add(largerSize);
JCheckBox fullBox = new JCheckBox("填滿");
fullBox.addActionListener(listener);
JButton foreground = new JButton("前景色");
foreground.setBackground(Color.white);
JButton background = new JButton("背景色");
background.setBackground(Color.black);
JButton clearScr = new JButton("清除畫面");
clearScr.addActionListener(listener);
clearScr.setActionCommand("clear");
toolPanel.add(fullBox);
toolPanel.add(foreground);
toolPanel.add(background);
toolPanel.add(clearScr);
addMouseMotionListener(new MouseMotion());
Ing = 0;
Init = 0;
penSize = 3;
}
int mox, moy, nex, ney;
int Ing, Init, penSize;
public void paint(Graphics g) {
int x, y;
stateText.setText("游標位置 : (" + (mox - 100) + "," + (moy - 30)
+ ") (拖曳)");
if (Init == 0) {
stateText.paint(stateText.getGraphics());
toolPanel.paint(toolPanel.getGraphics());
for (x = 110; x < 700; x++) {
for (y = 0; y < 730; y++) {
board[x][y] = Color.white;
}
g.setColor(Color.white);
g.drawLine(x, 0, x, 730);
}
Init = 1;
} else {
g.setColor(board[mox][moy]);
g.drawLine(mox, moy, nex, ney);
g.drawLine(mox + 1, moy + 1, nex + 1, ney + 1);
g.drawLine(mox + 1, moy, nex + 1, ney);
mox = nex;
moy = ney;
}
}
class MsgListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand() == "clear") {
Init = 0;
repaint();
return;
}
JOptionPane.showMessageDialog(null, "你點選了 : " + e.getActionCommand(),
"訊息", JOptionPane.INFORMATION_MESSAGE);
}
}
class BoxListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
String s = (String) e.getItem();
if (e.getStateChange() == ItemEvent.SELECTED) {
JOptionPane.showMessageDialog(null, "你點選了 : " + s, "訊息",
JOptionPane.INFORMATION_MESSAGE);
}
}
}
class MouseMotion extends MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
nex = e.getX();
ney = e.getY();
if (nex > 110 && ney < 730 && nex < 700) {
if(mox <= 110 || moy >= 730 || mox >= 700) {
mox = nex; moy = ney;
}
board[nex][ney] = using;
repaint();
} else {
stateText.setText("游標位置 : 畫布區外");
}
}
public void mouseMoved(MouseEvent e) {
mox = e.getX();
moy = e.getY();
if (mox > 110 && mox < 730 && mox < 700) {
stateText.setText("游標位置 : (" + (mox - 100) + "," + (moy - 30)
+ ") (停留)");
} else {
stateText.setText("游標位置 : 畫布區外");
}
}
}
public static void main(String[] args) {
pFrame gui = new pFrame();
gui.setVisible(true);
}
}