在面板上绘图,但通过另一个框架添加它时,没有绘制
Drawing on a panel but when adding it through another frame, nothing draws
我正在做一个项目,我工作的总体思路是在一个独立的项目中完成它的每个部分,然后在完成后通过库将其添加到主项目中。
我的问题是 - 我所做的一部分是在面板上进行绘画。
当我添加一个将它连接到主项目的图层窗格时,实际上没有绘图发生。
这是我的项目示例代码:
在代码示例 1 中有 JLayeredPane,其中包含我用来执行绘图的面板。
代码示例 2 中有一个按钮。它的 actionPerformed 是将 JLayeredPane 添加到面板。但是问题是添加JLayeredPane后没有出现绘图。
代码示例 1:
public class GraphGui extends javax.swing.JFrame {
/**
* Creates new form GraphGui
*/
adjacencyMatrix m = new adjacencyMatrix();
Dfs df = new Dfs();
int[] x = new int[df.MAX_VERTS];
int[] y = new int[df.MAX_VERTS];
public Graphics2D d;
public Graphics2D doo;
int i = 0;
public GraphGui() {
setlookAndFeel();
initComponents();
setLocationRelativeTo(null);
DFS.setVisible(true);
adjMatrics.setVisible(false);
//display is the panel that draw over
d = (Graphics2D) display.getGraphics();
doo = (Graphics2D) jPanel2.getGraphics();
}
//crating an initialization of components are done automatically
public void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
df.dfs();
doo.setFont(new Font("TimesRoman", Font.BOLD, 19));
doo.drawString("visits: " + df.out, 5, 20);
df.out = "";
}
public void AddE1ActionPerformed(java.awt.event.ActionEvent evt) {
String j = start1.getText();
int k = Integer.parseInt(j) - 1;
String c = end1.getText();
int v = Integer.parseInt(c) - 1;
df.addEdge(k, v);
d.setFont(new Font("TimesRoman", Font.BOLD, 17));
d.drawLine(x[k] + 30, y[k] + 20, x[v], y[v] + 19);
}
public void AddV1ActionPerformed(java.awt.event.ActionEvent evt) {
String f = ver1.getText();
String toUpperCase = f.toUpperCase();
char r = toUpperCase.charAt(0);
df.addVertex(r);
int radius = 30;
int R = (int) (Math.random() * 256);
int G = (int) (Math.random() * 256);
int B = (int) (Math.random() * 256);
x[i] = R % 320;
y[i] = B % 167;
d.setColor(new Color(R, G, B));
d.setFont(new Font("TimesRoman", Font.BOLD, 15));
d.drawOval(x[i], y[i], radius, radius);
d.fillOval(x[i], y[i], radius, radius);
d.setColor(Color.BLACK);
d.drawString(r + "", x[i] + 10, y[i] + 20);
d.drawOval(0, 0, radius, radius);
i++;
}
代码示例 1 应该执行的操作显示在此处 link:
https://pbs.twimg.com/media/CG8INXZXAAEqthh.png:large
代码示例 2
{
private void graphBTActionPerformed(java.awt.event.ActionEvent evt) {
GraphGui gr=new GraphGui();
jPanel2.removeAll();
jPanel2.add(gr.DFS);
MainLayer.setVisible(false);
Displaylayer.setVisible(true);
}
}
下面的 link 是我添加面板后得到的-
什么都没画。
这里有 2 个不同的问题。
(1) 最简单的答案是 - 您需要从操作方法中调用 'getGraphics'。不是来自构造函数。例如
public void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Graphics2D doo = (Graphics2D) jPanel2.getGraphics();
...
doo.setFont(...);
doo.drawString(...);
}
(2) 这会生成可见的图画,但只要 java 决定重绘它们就会消失 - 例如如果你最小化框架。这可以通过备注中提到的 paintComponent() 来解决。基本思想是您的组件(例如 jPanel2)将包含一个 数据结构 ,其中包含它需要绘制的所有内容 - 字符串、边、顶点等。在 paintComponent 中,您绘制它们。在 actionPerformed() 中,您更改数据结构并调用 'repaint'。这种方法的草图:
class MyPanel extends JPanel{
private String text;
private Point[] vertextes;
public void addVertext(..)
public void paintComponent(Graphics g){
... use g to drawString, drawOval... according to 'text' and 'vertexes'
}
}
// Then in your JFrame:
private MyPanel p;
...
actionPerfomred(...){
p.addVertext(..)
p.repaint();
}
我正在做一个项目,我工作的总体思路是在一个独立的项目中完成它的每个部分,然后在完成后通过库将其添加到主项目中。
我的问题是 - 我所做的一部分是在面板上进行绘画。 当我添加一个将它连接到主项目的图层窗格时,实际上没有绘图发生。
这是我的项目示例代码:
在代码示例 1 中有 JLayeredPane,其中包含我用来执行绘图的面板。
代码示例 2 中有一个按钮。它的 actionPerformed 是将 JLayeredPane 添加到面板。但是问题是添加JLayeredPane后没有出现绘图。
代码示例 1:
public class GraphGui extends javax.swing.JFrame {
/**
* Creates new form GraphGui
*/
adjacencyMatrix m = new adjacencyMatrix();
Dfs df = new Dfs();
int[] x = new int[df.MAX_VERTS];
int[] y = new int[df.MAX_VERTS];
public Graphics2D d;
public Graphics2D doo;
int i = 0;
public GraphGui() {
setlookAndFeel();
initComponents();
setLocationRelativeTo(null);
DFS.setVisible(true);
adjMatrics.setVisible(false);
//display is the panel that draw over
d = (Graphics2D) display.getGraphics();
doo = (Graphics2D) jPanel2.getGraphics();
}
//crating an initialization of components are done automatically
public void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
df.dfs();
doo.setFont(new Font("TimesRoman", Font.BOLD, 19));
doo.drawString("visits: " + df.out, 5, 20);
df.out = "";
}
public void AddE1ActionPerformed(java.awt.event.ActionEvent evt) {
String j = start1.getText();
int k = Integer.parseInt(j) - 1;
String c = end1.getText();
int v = Integer.parseInt(c) - 1;
df.addEdge(k, v);
d.setFont(new Font("TimesRoman", Font.BOLD, 17));
d.drawLine(x[k] + 30, y[k] + 20, x[v], y[v] + 19);
}
public void AddV1ActionPerformed(java.awt.event.ActionEvent evt) {
String f = ver1.getText();
String toUpperCase = f.toUpperCase();
char r = toUpperCase.charAt(0);
df.addVertex(r);
int radius = 30;
int R = (int) (Math.random() * 256);
int G = (int) (Math.random() * 256);
int B = (int) (Math.random() * 256);
x[i] = R % 320;
y[i] = B % 167;
d.setColor(new Color(R, G, B));
d.setFont(new Font("TimesRoman", Font.BOLD, 15));
d.drawOval(x[i], y[i], radius, radius);
d.fillOval(x[i], y[i], radius, radius);
d.setColor(Color.BLACK);
d.drawString(r + "", x[i] + 10, y[i] + 20);
d.drawOval(0, 0, radius, radius);
i++;
}
代码示例 1 应该执行的操作显示在此处 link:
https://pbs.twimg.com/media/CG8INXZXAAEqthh.png:large
代码示例 2
{
private void graphBTActionPerformed(java.awt.event.ActionEvent evt) {
GraphGui gr=new GraphGui();
jPanel2.removeAll();
jPanel2.add(gr.DFS);
MainLayer.setVisible(false);
Displaylayer.setVisible(true);
}
}
下面的 link 是我添加面板后得到的- 什么都没画。
这里有 2 个不同的问题。
(1) 最简单的答案是 - 您需要从操作方法中调用 'getGraphics'。不是来自构造函数。例如
public void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Graphics2D doo = (Graphics2D) jPanel2.getGraphics();
...
doo.setFont(...);
doo.drawString(...);
}
(2) 这会生成可见的图画,但只要 java 决定重绘它们就会消失 - 例如如果你最小化框架。这可以通过备注中提到的 paintComponent() 来解决。基本思想是您的组件(例如 jPanel2)将包含一个 数据结构 ,其中包含它需要绘制的所有内容 - 字符串、边、顶点等。在 paintComponent 中,您绘制它们。在 actionPerformed() 中,您更改数据结构并调用 'repaint'。这种方法的草图:
class MyPanel extends JPanel{
private String text;
private Point[] vertextes;
public void addVertext(..)
public void paintComponent(Graphics g){
... use g to drawString, drawOval... according to 'text' and 'vertexes'
}
}
// Then in your JFrame:
private MyPanel p;
...
actionPerfomred(...){
p.addVertext(..)
p.repaint();
}