我知道这是Java破解的一个愚蠢问题。
目前,我正在编写一个绘画程序。
所以我的问题是,我想在一个小下拉菜单中设置笔划大小。
下拉菜单的代码如下:
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement("1");
model.addElement("5");
model.addElement("10");
JComboBox comboBox = new JComboBox(model);
panel.add(comboBox);
笔划大小的代码在这里:
public void mouseDragged(MouseEvent e) {
currentX = e.getX();
currentY = e.getY();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
Stroke stroke = new BasicStroke(10);
graphics2D.setStroke(stroke);
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
oldX = currentX;
oldY = currentY;
}
BasicStroke中的10只是一些随机数。我想实现它,它从下拉列表中读取(标准1),将其保存在变量中,然后该变量在BasicStroke函数中使用。
这是完整的代码(Netbeans项目):
package paint;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Paint {
public static void main(String[] args) {
PaintWindow frame = new PaintWindow();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setVisible(true);
}
}
class PaintWindow extends JFrame {
public PaintWindow() {
setTitle("Paint it");
setSize(700, 600);
panel = new JPanel();
panel.setPreferredSize(new Dimension(64, 64));
drawPad = new PadDraw();
//Creates a new container
Container content = this.getContentPane();
content.setLayout(new BorderLayout());
//sets the panel to the left, padDraw in the center
content.add(panel, BorderLayout.NORTH);
content.add(drawPad, BorderLayout.CENTER);
//add the color buttons:
makeColorButton(Color.BLACK);
makeColorButton(Color.BLUE);
makeColorButton(Color.MAGENTA);
makeColorButton(Color.RED);
makeColorButton(Color.ORANGE);
makeColorButton(Color.YELLOW);
makeColorButton(Color.GREEN);
makeColorButton(Color.CYAN);
DefaultComboBoxModel model = new DefaultComboBoxModel();
model.addElement("1");
model.addElement("5");
model.addElement("10");
JComboBox comboBox = new JComboBox(model);
panel.add(comboBox);
//creates the clear button
JButton clearButton = new JButton("Clear");
clearButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
drawPad.clear();
}
});
panel.add(clearButton);
panel = new JPanel();
JLabel jlabel = new JLabel("Copyright© by Jan Büttiker");
panel.setPreferredSize(new Dimension(0, 20));
panel.add(jlabel);
content.add(panel, BorderLayout.SOUTH);
}
/*
* makes a button that changes the color
* @param color the color used for the button
*/
public void makeColorButton(final Color color) {
JButton tempButton = new JButton();
tempButton.setBackground(color);
tempButton.setPreferredSize(new Dimension(56, 56));
panel.add(tempButton);
tempButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
drawPad.changeColor(color);
}
});
}
private JPanel panel;
private PadDraw drawPad;
}
class PadDraw extends JComponent {
//this is gonna be the image that you draw on
Image image;
//this is what we'll be using to draw on
Graphics2D graphics2D;
//these are gonna hold the mouse coordinates
int currentX, currentY, oldX, oldY;
public PadDraw() {
setDoubleBuffered(false);
addMouseListener(new MouseAdapter() {
//if the mouse is pressed it sets the oldX & oldY
//coordinates as the mouses x & y coordinates
public void mousePressed(MouseEvent e) {
oldX = e.getX();
oldY = e.getY();
}
});
addMouseMotionListener(new MouseMotionAdapter() {
//while the mouse is dragged it sets currentX & currentY as the mouses x and y
//then it draws a line at the coordinates
//it repaints it and sets oldX and oldY as currentX and currentY
public void mouseDragged(MouseEvent e) {
currentX = e.getX();
currentY = e.getY();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
Stroke stroke = new BasicStroke(10);
graphics2D.setStroke(stroke);
graphics2D.drawLine(oldX, oldY, currentX, currentY);
repaint();
oldX = currentX;
oldY = currentY;
}
});
}
//this is the painting bit
//if it has nothing on it then
//it creates an image the size of the window
//sets the value of Graphics as the image
//sets the rendering
//runs the clear() method
//then it draws the image
public void paintComponent(Graphics g) {
if (image == null) {
image = createImage(getSize().width, getSize().height);
graphics2D = (Graphics2D) image.getGraphics();
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
clear();
}
g.drawImage(image, 0, 0, null);
}
//this is the clear
//it sets the colors as white
//then it fills the window with white
//thin it sets the color back to black
public void clear() {
graphics2D.setPaint(Color.white);
graphics2D.fillRect(0, 0, getSize().width, getSize().height);
graphics2D.setPaint(Color.black);
repaint();
}
public void changeColor(Color theColor) {
graphics2D.setPaint(theColor);
repaint();
}
}
这是我的第一篇文章,请保持友好,我仍处于学习阶段^^。
感谢您的帮助,祝您有美好的一天
最佳答案
为此,您需要在ItemListener
上使用JComboBox
。阅读有关ComboBox in tutorial的更多信息。
1)将实例变量public float strokeSize = 10.0f;
作为默认值添加到PadDraw中。
2)使用Stroke stroke = new BasicStroke(strokeSize);
代替Stroke stroke = new BasicStroke(10);
3)以下面的方式创建您的组合框,如果您更改strokeSize
中的值,它将更改JComboBox
值:
DefaultComboBoxModel<Float> model = new DefaultComboBoxModel<Float>();
model.addElement(1f);
model.addElement(5f);
model.addElement(10f);
final JComboBox<Float> comboBox = new JComboBox<Float>(model);
comboBox.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent arg0) {
Float selectedItem = (Float) comboBox.getSelectedItem();
if(selectedItem != null){
drawPad.strokeSize = selectedItem;
}
}
});