JFrame類
它是屏幕上window的對象,能夠最大化、最小化、關閉,解決將Swing三大基本構造塊
(按鈕、標籤、文本字段)組織起來,並把它們呈現給用戶——(容器)
JPanel類
是java圖形用戶界面(GUI)工具包swing中的面板容器類,是一種輕量級容器,可以加入到Fram窗體中,其自身可以嵌套組合,在不同子容器中包含其他組件(Button,TextArea等)功能是對窗體上的這些控制進進行組合。
以下是部分代碼實現:
package mini.draw.Pad;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
/**
* 畫圖工具類
* 1.創建一個窗體
* 2.創建面圖花板
* 3.實現隨筆畫功能
* 4.擴充菜單欄
* 5.擴充性狀態欄(按鈕)
*/
public class MiniDrawPad {
private JFrame jFrame = new JFrame("迷你畫圖板");//帶有標題和邊框的頂層窗口
//定義畫圖區域的高度和寬度
private final int WIDTH = 1000;
private final int HEIGHT = 700;
private MyPanel mp = new MyPanel();
//定義一個BufferedImage對象,並獲取image對象的Graphics-畫筆
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
//指定一個寬和高,創建一個不帶透明色的對象
Graphics2D g = (Graphics2D) image.getGraphics(); //獲得在圖像上畫圖的工具-畫筆
//設置畫筆的顏色
private Color color = Color.black; //當前默認顏色黑色
//畫筆的粗細
private float stroke = 1.0f;
//上一次鼠標拖動事件的鼠標座標
private int prex = -1;
private int prey = -1;
int R, G, B; //用來存放當前的色彩值
String style1; //用來存放當前字體
JLabel statusBar;//當前鼠標狀態
//創建畫板類
public class MyPanel extends JPanel {
//設置畫板
public MyPanel() {
setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
setBounds(0, 0, WIDTH, HEIGHT);
setBackground(Color.WHITE);
}
public void paint(Graphics g) {
g.drawImage(image, 0, 0, null);
//img-要繪製的指定圖像,如果爲null,該方法不執行任何操作
}
}
//選擇顏色
public void chooseColor() {
color = JColorChooser.showDialog(jFrame, "選擇顏色", color);
R = color.getRed();
G = color.getGreen();
B = color.getBlue();
color = new Color(R, G, B);
}
//獲取畫筆
//創建菜單條
public void createBar() {
JMenuBar bar = new JMenuBar();//定義菜單條
JMenu fileMenu = new JMenu("file");//
fileMenu.setMnemonic('F');//表示助記符的鍵代碼
JMenuItem newItem = new JMenuItem("New");//菜單項
newItem.setMnemonic('N');
JMenuItem saveItem = new JMenuItem("Save");//菜單項
saveItem.setMnemonic('S');
JMenuItem openItem = new JMenuItem("Open");//菜單項
openItem.setMnemonic('O');
//退出菜單項
JMenuItem exitItem = new JMenuItem("Exit");//菜單項
exitItem.setMnemonic('E');
exitItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
fileMenu.add(newItem);
fileMenu.add(saveItem);
fileMenu.add(openItem);
fileMenu.addSeparator();
fileMenu.add(exitItem);
//顏色菜單
JMenu colorMenu = new JMenu("Color");
JMenuItem colorItem = new JMenuItem("Choose Color");
colorItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//如果被觸發,則調用選擇顏色函數段
chooseColor();
}
});
colorMenu.add(colorItem);
//設置線條粗細菜單
JMenu strokeMenu = new JMenu("Stroke");
JMenuItem strokeItem = new JMenuItem("Set Stroke");
strokeItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//如果被觸發,則調用設置線條粗細的函數段
setStroke();
}
});
strokeMenu.add(strokeItem);
//設置提示菜單
JMenu helpMenu = new JMenu("Help");
JMenuItem aboutItem = new JMenuItem("About this Draw pad!");
aboutItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "this is a mini draw pad Copy(c)2020",
"畫圖板程序說明", JOptionPane.INFORMATION_MESSAGE);
}
});
helpMenu.add(aboutItem);
bar.add(fileMenu);
bar.add(colorMenu);
bar.add(strokeMenu);
bar.add(helpMenu);
jFrame.setJMenuBar(bar);
}
//設置線條粗細
public void setStroke() {
String input = JOptionPane.showInputDialog("請輸入一個float數值( >0 )");
stroke = Float.parseFloat(input);
}
//創建按鈕
public void createButton() {
JToolBar buttonPanel = new JToolBar(JToolBar.HORIZONTAL);
String[] buttonNames = {"隨筆", "直線", "空心圓", "空心矩形", "橡皮擦", "文字按鈕"};
for (int i = 0; i < buttonNames.length; i++) {
JButton button = new JButton(buttonNames[i]);
buttonPanel.add(button);
}
//設置字體風格的選擇
String[] styleNames = {"宋體", "隸書", "楷體", "仿宋", "華文行楷", "方正舒體", "仿宋_GB2312", "Serif"};
JComboBox styles = new JComboBox<>(styleNames);
styles.setMaximumRowCount(6); //設置JComboBox顯示的最大行數
styles.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
style1 = styleNames[styles.getSelectedIndex()];
}
});
styles.setMinimumSize(new Dimension(50, 20));
styles.setMaximumSize(new Dimension(120, 20));
JCheckBox bold = new JCheckBox("BOLD"); //複選框
JCheckBox italic = new JCheckBox("ITALIC"); //
buttonPanel.add(bold);
buttonPanel.add(italic);
buttonPanel.add(styles);
statusBar = new JLabel("當前的鼠標狀態");
statusBar.setText("welcome minidraw pad!!!");
Container c = jFrame.getContentPane();//初始化一個容器
c.add(buttonPanel, BorderLayout.NORTH);
c.add(statusBar, BorderLayout.SOUTH);
}
public void init() {
/**
對於鼠標的移動和拖放,用鼠標運動監聽器MouseMotionListener
*/
mp.addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
if (prex > 0 && prey > 0) {
g.setColor(color);
g.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL));
g.drawLine(prex, prey, e.getX(), e.getY());
//x1,x2是確定直線的起始點,分別是橫縱座標,同理x2,y2確定直線的終點
}
prex = e.getX();
prey = e.getY();
statusBar.setText("Mouse Press @[" + e.getX() + "," + e.getY() + "]");
mp.repaint(); //重繪mp對象
}
});
jFrame.setBounds(0, 0, WIDTH, HEIGHT);
jFrame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
g.fillRect(0, 0, WIDTH, HEIGHT);
jFrame.add(mp);
createBar();
createButton();
jFrame.setVisible(true);
}
public static void main(String[] args) {
MiniDrawPad miniDrawPad = new MiniDrawPad();
miniDrawPad.init();
}
}
由於時間關係,沒能做完,只是半成。。。 以後有時間再繼續完成把。