在另一个组件中绘制
Draw in another component
我有作业要做,但是没有足够的信息,我现在被卡住了...这是问题所在,我有三个 类 :
"ChoicePanel" 扩展 JPanel 并将按钮添加到 select 带有 JComboBox
的颜色
public class ChoicePanel extends JPanel{
Draw dessin;
public ChoicePanel(Draw df) {
dessin = df;
...
// couleurs
final JComboBox<String> couleurs = new JComboBox<>(new String[] {"bleu", "jaune", "rouge"});
add(couleurs);
}
/** Know what color is selected */
private Color determineCouleur(int indice){
switch (indice) {
case 0:
return Color.BLUE;
case 1:
return Color.YELLOW;
case 2:
return Color.RED;
default:
return Color.BLACK;
}
}
}
"Draw" 扩展 JPanel 并存储所有轮廓并绘制它们
"Main" 创建包含 类 的框架
我必须将 Draw 设置为 MouseMotionListener,但我无法在 ChoixePanel 中获得颜色 selected,因为 JComobox 是在构造函数中创建的,我无法将其设置为字段。
那么如何从 Draw 中检查 ChoicePanel 的按钮值?
每个答案都会很有帮助!
练习的目的可能是帮助您了解scope and access in Java. Let's refactor the example seen here以满足您的要求。
A ChoicePanel
需要一种方法来更新 Draw
面板的实例;您可以将引用作为参数传递给面板的构造函数或如下所示的工厂方法。
public static JPanel create(Draw draw) {…}
在组合的动作侦听器中设置 draw
的颜色;如果更改不是背景颜色等 bound property,可选择调用 draw.repaint()
。
Hue h = (Hue) colors.getSelectedItem();
draw.setBackground(h.getColor());
//draw.repaint();
因为 Draw
可能不包含组件,请覆盖 getPreferredSize()
,如 here 及以下所示。
I can't create a private class…
为方便 运行 下面的示例,ChoicePanel
和 Draw
作为 private static
成员包含在内。只需将每个文件移至其自己的文件,不存在 modifiers,即可获得独立的 类,并具有来自 Main
.[=] 的 package-private 访问权限30=]
JFrame f = new JFrame("Main");
Draw d = new Draw();
f.add(d, BorderLayout.CENTER);
f.add(ChoicePanel.create(d), BorderLayout.SOUTH);
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* @see
*/
public class Main {
private static class ChoicePanel {
public static JPanel create(Draw draw) {
JPanel p = new JPanel();
final JComboBox colors = new JComboBox();
for (Hue h : Hue.values()) {
colors.addItem(h);
}
colors.addActionListener((ActionEvent e) -> {
Hue h = (Hue) colors.getSelectedItem();
draw.setBackground(h.getColor());
});
p.add(colors);
return p;
}
}
private static class Draw extends JPanel {
public Draw() {
this.setBackground(Hue.values()[0].getColor());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
}
public enum Hue {
Cyan(Color.cyan), Magenta(Color.magenta), Yellow(Color.yellow),
Red(Color.red), Green(Color.green), Blue(Color.blue);
private final Color color;
private Hue(Color color) {
this.color = color;
}
public Color getColor() {
return color;
}
}
private void display() {
JFrame f = new JFrame("Main");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Draw d = new Draw();
f.add(d, BorderLayout.CENTER);
f.add(ChoicePanel.create(d), BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new Main().display();
});
}
}
我有作业要做,但是没有足够的信息,我现在被卡住了...这是问题所在,我有三个 类 :
"ChoicePanel" 扩展 JPanel 并将按钮添加到 select 带有 JComboBox
的颜色public class ChoicePanel extends JPanel{ Draw dessin; public ChoicePanel(Draw df) { dessin = df; ... // couleurs final JComboBox<String> couleurs = new JComboBox<>(new String[] {"bleu", "jaune", "rouge"}); add(couleurs); } /** Know what color is selected */ private Color determineCouleur(int indice){ switch (indice) { case 0: return Color.BLUE; case 1: return Color.YELLOW; case 2: return Color.RED; default: return Color.BLACK; } } }
"Draw" 扩展 JPanel 并存储所有轮廓并绘制它们
"Main" 创建包含 类 的框架
我必须将 Draw 设置为 MouseMotionListener,但我无法在 ChoixePanel 中获得颜色 selected,因为 JComobox 是在构造函数中创建的,我无法将其设置为字段。 那么如何从 Draw 中检查 ChoicePanel 的按钮值?
每个答案都会很有帮助!
练习的目的可能是帮助您了解scope and access in Java. Let's refactor the example seen here以满足您的要求。
A
ChoicePanel
需要一种方法来更新Draw
面板的实例;您可以将引用作为参数传递给面板的构造函数或如下所示的工厂方法。public static JPanel create(Draw draw) {…}
在组合的动作侦听器中设置
draw
的颜色;如果更改不是背景颜色等 bound property,可选择调用draw.repaint()
。Hue h = (Hue) colors.getSelectedItem(); draw.setBackground(h.getColor()); //draw.repaint();
因为
Draw
可能不包含组件,请覆盖getPreferredSize()
,如 here 及以下所示。I can't create a private class…
为方便 运行 下面的示例,
ChoicePanel
和Draw
作为private static
成员包含在内。只需将每个文件移至其自己的文件,不存在 modifiers,即可获得独立的 类,并具有来自Main
.[=] 的 package-private 访问权限30=]JFrame f = new JFrame("Main"); Draw d = new Draw(); f.add(d, BorderLayout.CENTER); f.add(ChoicePanel.create(d), BorderLayout.SOUTH);
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* @see
*/
public class Main {
private static class ChoicePanel {
public static JPanel create(Draw draw) {
JPanel p = new JPanel();
final JComboBox colors = new JComboBox();
for (Hue h : Hue.values()) {
colors.addItem(h);
}
colors.addActionListener((ActionEvent e) -> {
Hue h = (Hue) colors.getSelectedItem();
draw.setBackground(h.getColor());
});
p.add(colors);
return p;
}
}
private static class Draw extends JPanel {
public Draw() {
this.setBackground(Hue.values()[0].getColor());
}
@Override
public Dimension getPreferredSize() {
return new Dimension(320, 240);
}
}
public enum Hue {
Cyan(Color.cyan), Magenta(Color.magenta), Yellow(Color.yellow),
Red(Color.red), Green(Color.green), Blue(Color.blue);
private final Color color;
private Hue(Color color) {
this.color = color;
}
public Color getColor() {
return color;
}
}
private void display() {
JFrame f = new JFrame("Main");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Draw d = new Draw();
f.add(d, BorderLayout.CENTER);
f.add(ChoicePanel.create(d), BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(() -> {
new Main().display();
});
}
}