关于JPanel,使用paint(Graphics g)和添加组件冲突

[size=medium]问题描述如下:
1、组织结构
一个JFrame,一个JPanel,一个Jlabel
2、主要问题:
JPanel使用了public void paint(Graphics g) {}来绘图[也就是给JPanel添加个背景]
JLabel使用了new JLabel(new ImageIcon(getdir(imageFile)))来设置图片[也就是JLabel是个图片]

现在我遇到的问题:JPanel.add(JLabel)后,JLabel不显示,我想JPanel即显示背景图片,同时也显示JLabel组件。。注意我不是有图片的Jabel这个组件,而不是单纯的显示图片..........

还请大家帮小弟一下。。。。。。

主要代码:
class MyPanel extends JPanel {
public void paint(Graphics g) {
g.drawImage(gameImage, 0, 0, null);
g.setFont(new Font("", Font.BOLD, 13));
g.setColor(Color.WHITE);
}
}

public class Chessman extends JLabel {
public Chessman(ImageIcon img)
{
this.setSize(img.getImage().getWidth(null),img.getImage().getHeight(null));
this.setIcon(img);
this.setIconTextGap(0);
this.setBorder(null);
this.setText(null);
this.setOpaque(false);
}

}
}
想要在MyPanel上既显示背景图片,也要显示Chessman这个JLabel组件[/size]

1个回答

[code="java"]
public void paint(Graphics g) {
super.paint(g);// 调用父类的paint方法或调用下面的方法直接绘制组件
// this.paintComponents(g);
g.drawImage(gameImage, 0, 0, null);
g.setFont(new Font("", Font.BOLD, 13));
g.setColor(Color.WHITE);
}[/code]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

JAVA中在JPanel里调用Graphics实现循环产生动画的问题。

想要实现用JAVA绘制简单的动画效果,大致就是先建一个JFrame对象,在里面添加一个JPanel,然后在JPanel里面用Graphics来进行画图,重复进行绘制一个与背景相同颜色的一张图像,在绘制一张其他的图像,经过一段时间之后重复进行。效果就是在一个背景中图像像右方移动。 在Graphics里面添加for语句在JFrame里面可以实现的。但是放到了JPanel里面就不行了,只会显示循环结束之后的图像,希望能够知道这个是什么原因造成的,能够用什么方法解决,望高手指教。 代码如下: package Jpg_2; import javax.swing.*; import java.awt.*; public class jpg_2 { public static void main(String[] args) { frame f=new frame(); } } class frame extends JFrame { CJPanel c; frame() { super("图片"); setSize(500,500); c=new CJPanel(); this.add(c); c.repaint(); setVisible(true); } class CJPanel extends JPanel { ImageIcon icon=new ImageIcon("f:/3.png"); ImageIcon icon2=new ImageIcon("f:/4.png"); Image image=icon.getImage(); Image image2=icon2.getImage(); public void paint(Graphics g) { g.drawImage(image,20,20,this); g.setColor(Color.red); g.fillRect(0,0,500,500); for (int i=20;i<180;i++) { g.drawImage(image2,i,20,this); g.drawImage(image,i+1,20,this); try { Thread.sleep(10); } catch(InterruptedException e){} } } } }

JPanel中添加组件覆盖问题

JPanel中添加组件,空布局,默认是先添加的显示层次比后添加的前。这个层次不可以不额外添加面板修改吗?

请问关于JPanel 中paint 方法重写的问题,void is an invalid type for the variable paint

import java.awt.Graphics; import javax.swing.JPanel; public class ipanel extends JPanel { public ipanel () { public void paint(Graphics g) { g.drawLine(0, 0, 10, 10); } } } public class Test { public static void main(String[] args) { new ipanel(); } } 编译会出现void is an invalid type for the variable paint的错误,即使在paint加入父类方法也没用。 可是在ipanel的构造器中应该是可以出现函数的吧? 请教大家,谢谢!

如何更新JPanel中的组件?

我有一个JDialog,里面的JPanel的内容是随着按钮的点击而更新的(类似于安装软件时的那个“下一步”按钮),我想实现点击“下一步”时更新JPanle的内容,请问如何做?以下是我的代码,但是不能实现更新JPanel的内容。 [code="java"] public class MyJDialog extends JDialog{ .... private JPanel panel; private JButton button = new JButton("next"); ... public MyJDialog (){ defaultPanel();//默认界面 .... next.addActionListener(new ActionListener() {//点击next按钮后,界面更新 public void actionPerformed(ActionEvent evt) { nextPanel(evt); } }); } private void defaultPanel(){ panel = new StepOnePanel() ; } private void nextPanel(ActionEvent evt){ panel = new StepTwoPanel(); } ... } [/code] Google了一下,有人说先remove掉panel里面的东西,然后updateUI(),如是我把nextPanel的内容改了一下: [code="java"] private void nextPanel(ActionEvent evt){ panel.removeAll() panel = new StepTwoPanel(); panel.updateUI(); } [/code] 仍然不能更新界面内容。 StepOnePanel()和StepTwoPanel()都能正确显示,所以大家不要怀疑StepOnePanel()和StepTwoPanel()两个类的正确性。 [b]问题补充:[/b] pJun (高级程序员): StepOnePanel() 和 StepTwoPanel()都是一个JPanel对象,默认显示StepOnePanel()或者StepTwoPanel()都能正确显示。 [b]问题补充:[/b] firefly.li (中级程序员): 首先多谢你的指点,界面显示的是空白,如果不使用removeAll()还是显示的StepOnePanel的界面,不是StepTwoPanel的。

请大神帮忙看下,为什么MyPanel中的Paint方法没有被调用

package javademo; import javax.swing.*; import java.awt.*; public class DrawDemo extends JFrame{ MyPanel mp = null; public static void main(String []args){ DrawDemo drawdemo = new DrawDemo(); } public DrawDemo(){ mp = new MyPanel(); this.add(mp); this.setSize(400, 400); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } } class MyPanel extends JPanel { //重写JPanel的Paint方法 //Graphics是绘图的重要类,你可以把它理解成一支画笔 public void Paint(Graphics g){ //调用父类函数完成初始化 //这句话不能少 super.paint(g); System.out.println("321"); //先画一个圆圈 g.drawOval(10, 10, 40, 60); } }

把JPanel添加到JScrollPane

package com.frame; import java.awt.BorderLayout; import java.awt.Button; import java.awt.Component; import java.awt.Container; import java.awt.Frame; //import java.awt.GridLayout; import java.awt.Label; import java.awt.Panel; import java.awt.TextArea; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.ScrollPaneConstants; @SuppressWarnings("serial") public class testjm1 extends JFrame implements ActionListener{ JButton btnquit,btnsubmit; JLabel labtitle,lab1[][],lab2[][],lab3[][]; JTextField text1[][],text2[][]; JTextArea txtarea; JScrollPane Jspane; int i,j,k; JPanel pp[][],ppp; double cbmatrix1[][];//成本转换邻接矩阵1 double cbmatrix2[][];//成本转换邻接矩阵2 int num; public double[][] getCbmatrix1() { return cbmatrix1; } public void setCbmatrix1(double[][] cbmatrix1) { this.cbmatrix1 = cbmatrix1; } public double[][] getCbmatrix2() { return cbmatrix2; } public void setCbmatrix2(double[][] cbmatrix2) { this.cbmatrix2 = cbmatrix2; } public void init(){ Jspane = new JScrollPane(); //分别设置水平和垂直滚动条总是出现 Jspane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); Jspane.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); //分别设置水平和垂直滚动条自动出现 // Jspane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); // Jspane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); } public testjm1(){ super("图中各节点的成本邻接矩阵信息采集"); setVisible(true); this.setFont(new java.awt.Font("Dialog",1,15)); num=8; ppp=new JPanel(); pp=new JPanel[num+1][num+1]; lab1=new JLabel[num+1][num+1]; lab2=new JLabel[num+1][num+1]; lab3=new JLabel[num+1][num+1]; text1=new JTextField[num+1][num+1]; text2=new JTextField[num+1][num+1]; cbmatrix1=new double[num+1][num+1]; cbmatrix2=new double[num+1][num+1]; btnquit=new JButton("退出"); btnsubmit=new JButton("提交"); labtitle=new JLabel("请输入图中各节点之间的权重区间:"); txtarea=new JTextArea(); setLayout(null); //setSize(300 + num * 200, 300 + num * 200); setSize(800,700); //ppp.setBounds(0, 0,300 + num * 200,300 + num * 200); ppp.setBounds(0,0,650,650); ppp.setLayout(null); this.add(ppp); ppp.add(txtarea); ppp.add(labtitle); ppp.add(btnquit); ppp.add(btnsubmit); labtitle.setBounds(30, 50, 280, 30); btnsubmit.setBounds(320, 50, 80, 30); JScrollPane ScrollPane = new JScrollPane(ppp); ScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); ScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); //ScrollPane.setBounds(0, 0,300 + num * 200,300 + num * 200); ScrollPane.setBounds(0,0,650,650); this.getContentPane().add(ScrollPane); this.setVisible(true); btnsubmit.addActionListener(this); for (i = 0; i <= num; i++) { Component heng = add(new Label("节点" + i)); ppp.add(heng); heng.setBounds(150 + i * 180, 100 , 50, 30); Component shu = add(new Label("节点" + i)); ppp.add(shu); shu.setBounds(30, 145 + i * 50, 50, 30);// 120>130 } for (i = 0; i <= num; i++) { for (j = 0; j <= num; j++) { k=0; lab1[i][j]=new JLabel("["); lab1[i][j].setSize(5, 25); lab2[i][j]=new JLabel(","); lab2[i][j].setSize(5, 25); lab3[i][j]=new JLabel("]"); lab3[i][j].setSize(5, 25); if (i == j) { text1[i][j]=new JTextField("0",2); text2[i][j]=new JTextField("0",2); pp[i][j]=new JPanel(); ppp.add(pp[i][j]); pp[i][j].add(lab1[i][j]); pp[i][j].add(text1[i][j]); pp[i][j].add(lab2[i][j]); pp[i][j].add(text2[i][j]); pp[i][j].add(lab3[i][j]); pp[i][j].setBounds(100 + j * 180, 140 + i * 50, 170, 25); } else { text1[i][j]=new JTextField(2); text2[i][j]=new JTextField(2); pp[i][j]=new JPanel(); ppp.add(pp[i][j]); pp[i][j].add(lab1[i][j]); pp[i][j].add(text1[i][j]); pp[i][j].add(lab2[i][j]); pp[i][j].add(text2[i][j]); pp[i][j].add(lab3[i][j]); pp[i][j].setBounds(100 + j * 180, 140 + i * 50, 170, 25); } } } } @Override public void actionPerformed(ActionEvent e) { if(e.getSource()==btnsubmit){ //System.out.println("########"); for(int i=0;i<=num;i++) for(int j=0;j<=num;j++){ // if(text1[i][j].getText()!=null||text1[i][j].getText()!=""){ // cbmatrix1[i][j]=Integer.parseInt(text1[i][j].getText()); // } if(text1[i][j].getText().trim().equals("")){ cbmatrix1[i][j]=0; } else cbmatrix1[i][j]=Double.parseDouble(text1[i][j].getText()); if(text2[i][j].getText().trim().equals("")){ cbmatrix2[i][j]=0; } else cbmatrix2[i][j]=Double.parseDouble(text2[i][j].getText()); } this.dispose(); } } public static void main(String[] args) { testjm1 t=new testjm1(); } } 把JPanel添加到JScrollPane里面,运行之后JScrollPane没办法显示JPanel中所有组件

JTabbedPane中添加了JPanel,然后在Jpanel中如何添加JInternalFrame

代码如下 public class TestInternalFrame { private JFrame frame = new JFrame("JInternalFrame"); // private JTabbedPane tab = new JTabbedPane(); private JPanel mainPanel = (JPanel) frame.getContentPane(); private JDesktopPane desk = new JDesktopPane(); private JInternalFrame internalFrame = new JInternalFrame(); private JPanel internalPanel = new JPanel(); public TestInternalFrame() { internalPanel.add(new JLabel(new ImageIcon("D:/java/mylove.jpg"))); internalFrame.add(internalPanel); desk.add(internalFrame); mainPanel.add(desk,BorderLayout.CENTER); internalFrame.pack(); internalFrame.setVisible(true); // frame.add(tab); // tab.addTab("图片", mainPanel); frame.setVisible(true); frame.setSize(500,500); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new TestInternalFrame(); } } 运行效果如下:图片并没有显示出来: ![图片说明](https://img-ask.csdn.net/upload/201504/21/1429582943_792534.png)

Jpanel添加鼠标监听器

部分代码如下,当点击退出系统是弹出退出!窗口,点击退出就关闭当前窗口,怎么实现 JTabbedPane tabbedPane = new JTabbedPane(); JPanel ExitPanel = new JPanel(); //退出面板 ExitPanel.setBackground(Color.white); ExitPanel.setLayout(new BoxLayout(ExitPanel, BoxLayout.X_AXIS)); if(ExitPanel.equals (" 退出 ")){ JOptionPane.showMessageDialog(null, "退出!"); System.exit(0); }; tabbedPane.addTab(" 退出系统 ", null, ExitPanel, " 退出系统 "); return tabbedPane; }

JPanel面板为什么不能直接用for循环添加

初始化了四个JPanel面板,添加的时候突发奇想, 想试试用for循环,结果出错了。 PS:我知道不能这么写,因为p不是数组。 想问问大家如果想实现for循环添加,应该怎么写呢。 代码如下: ``` Container c= getContentPane(); c.setLayout(new GridLayout(2, 1)); JPanel p1 = new JPanel(new GridLayout(1,3,10,10)); JPanel p2 = new JPanel(new GridLayout(1,2,10,10)); JPanel p3 = new JPanel(new GridLayout(1,2,10,10)); JPanel p4 = new JPanel(new GridLayout(2,1,10,10)); for(int i =1;i<5;i++){ c.add(p[i]); } } ```

java关于JFrame中添加多个JPanel?

如果创建一个JPanel数组,但是每个JPanel都画了一个图形,但是添加到面板容器上,只显示容器最后一个图形,为什么其它都没有显示?

java jpanel之borderlayout覆盖问题

在窗体中添加一个jpanel面板,在面板中添加borderlayout布局,在布局添加相同组件在中间部分和north部分,north部分会被中间部分覆盖,如何在面板添加相同组件不会被中间部分覆盖?

<Jtree>,JPanel中添加JLabel显示问题

public java.awt.Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { java.awt.Component component = null; if(selected) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; if(true){label1.setIcon(lockiImageIcon);} ProductAtributeNodeInfo nodeInfo = (ProductAtributeNodeInfo) node.getUserObject(); String title = nodeInfo.toString(); label2.setText(title); label2.setFont(font.deriveFont(Font.BOLD)); label3.setFont(font.deriveFont(Font.BOLD, CHECKMARK_FONT_SIZE)); component = fSelectedComponent; } return component; } 代码如上,重写了getTreeCellRendererComponent方法,三个Label之前定义好了。label1是个条件判断。当我选中某个节点的时候,且label1的条件为true,应该三个都显示。但是页面上label3不显示。(当我鼠标从JTree上移开再移动进来的时候,label3显示)。且我不添加label1的时候。label3也正常显示。

关于Jpanel, JScrollPane ,Jtable嵌套使用的问题

如题,我先建了一个继承了JPanel的 ListAddMainPanel。在这个ListAddMainPanel中,我嵌套了一个JScrollPane类的panel_1,在这个JScrollPane里,我放置了一个Jtable,Jtable 使用了DefaultTableModel。(可能看着有点晕,其实很简单,就是下面的那个图片) 使用时,我是在JFrame里的contentPane里先新建一个底层Panel,然后调用这个ListAddMainPanel的构造函数。想要给Table里加数据时,调用这个ListAddMainPanel里之前写好的fulfillTable函数 菜鸟觉得这个架构理论上应该行得通,但是问题来了,无论我使用什么样的方法,比如addRow();addColumn();setColumnIdentifiers(); 测试显示没有问题,数据也传进去了,程序也没报错,可他的界面就是没有出现表格_(:зゝ∠)_ 换了很多种方法,都没奏效,于是默默来求大佬帮助_(:зゝ∠)_ ![图片说明](https://img-ask.csdn.net/upload/2 ``` package w.teacher; import java.awt.Dimension; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JButton; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableModel; import javax.swing.JTextField; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.JComboBox; public class ListAddMainPanel extends JPanel { // private JTable table1,table2,table3,table4,table5; public JLabel timeLabel; public JTable table; public DefaultTableModel tableModel; public JTextField textField; public JComboBox<String> gradeBox; public JButton addButton,importButton; /** * Create the panel. */ public ListAddMainPanel() { setLayout(null); setPreferredSize(new Dimension(856, 417)); setOpaque(false); JScrollPane panel_1 = new JScrollPane(table); panel_1.setBounds(14, 72, 493, 319); panel_1.setLayout(null); panel_1.setVisible(true); add(panel_1); //Table table = new JTable(tableModel); // tableModel = (DefaultTableModel)table.getModel(); // table.setPreferredScrollableViewportSize(new Dimension(493,319));//设置table大小 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//关闭表格列自动调整,此时水平滚动条可见 // table.setBounds(0, 0, 493, 319); panel_1.add(table);//原位置Table代码 table.setVisible(true); // tableModel.setColumnIdentifiers(name1111); panel_1.setViewportView(table);//原位置Table代码 } public void fulfillTable(String[] title,String[][] data) { // for(int i = 0;i<100;i++){ // for(int j = 0;j<7;j++) // System.out.println(data[i][j]); // } // tableModel = new DefaultTableModel(data, name); // table = new JTable(tableModel); if(title!=null) { for(int i = 0;i<title.length;i++) { tableModel.addColumn(title[i]); } } for(int i = 0;data[i+1][0]!=null;i++) { String[] mString = new String[data[i].length]; for(int y = 0;y<7;y++) { mString[y] = data[i][y]; System.out.println(mString[y]); } tableModel.addRow(mString); // System.out.println(mString); } } ```

关于jpanel调用 paintComponent的问题

为什么利用反射生成jpanel对象之后,没有调用paintComponent方法。 这种情况下,将窗口缩小后就会显示预期的图像。 直接利用数组最想不会出现这种问题。。 这是为什么啊??

请问怎么在JPanel中添加图片啊

java ``` package PPS; import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; import javax.swing.JLabel; import javax.swing.SwingConstants; import java.awt.Font; import java.awt.Graphics; import javax.swing.JTextField; import javax.swing.JButton; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class loginFram extends JFrame { private JPanel contentPane; private JTextField textField; private JTextField textField_1; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { loginFram frame = new loginFram(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } /** * Create the frame. */ public loginFram() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 450, 300); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null); JLabel label = new JLabel("\u7528\u6237\u767B\u5F55\u754C\u9762"); label.setBounds(5, 5, 422, 24); label.setFont(new Font("微软雅黑", Font.PLAIN, 18)); label.setHorizontalAlignment(SwingConstants.CENTER); contentPane.add(label); JLabel label_1 = new JLabel("\u7528\u6237\u540D"); label_1.setBounds(124, 79, 72, 18); contentPane.add(label_1); textField = new JTextField(); textField.setBounds(211, 76, 86, 24); contentPane.add(textField); textField.setColumns(10); JLabel label_2 = new JLabel("\u5BC6\u7801"); label_2.setBounds(125, 124, 72, 18); contentPane.add(label_2); textField_1 = new JTextField(); textField_1.setBounds(211, 121, 86, 24); contentPane.add(textField_1); textField_1.setColumns(10); JButton btnNewButton = new JButton("\u767B\u5F55"); btnNewButton.setBounds(104, 194, 113, 27); contentPane.add(btnNewButton); JButton btnNewButton_1 = new JButton("\u53D6\u6D88"); btnNewButton_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { } }); btnNewButton_1.setBounds(231, 194, 113, 27); contentPane.add(btnNewButton_1); JPanel panel = new JPanel(); panel.setBounds(14, 79, 96, 79); contentPane.add(panel); } } ```

java 多个JPanel添加到一个JPanel里面出现的问题

我在主窗口类里面添加了JPanel 希望通过点击添加3个已经写好的Panel if(e.getActionCommand().equals("DES")) { desPan = new DesPanel(); jp.add(desPan.desPanel1, BorderLayout.WEST); jp.add(desPan.desPanel2, BorderLayout.CENTER); jp.add(desPan.desPanel3, BorderLayout.SOUTH); jp.validate(); } ![图片说明](https://img-ask.csdn.net/upload/201612/08/1481163204_151779.png) 结果如上 东西都被扭曲了,原本3个Panel添加到JFrame里面是这样的 ![图片说明](https://img-ask.csdn.net/upload/201612/08/1481163229_252391.png) 三个Panel的代码着这么写的,我调试了半天 也没能调整好 怎么解决啊 desPanel1 = new JPanel(); desPanel2 = new JPanel(); desPanel3 = new JPanel(); jl_des1 = new JLabel("Secret key:"); jl_des2 = new JLabel("Plain text:"); jl_des3 = new JLabel("Cipher text"); jtf_des1 = new JTextField(); // jtf_des1.setText(null); jtf_des2 = new JTextField(); // jtf_des2.setText(null); jtf_des3 = new JTextField(); // jtf_des3.setText(null); button_des1 = new JButton("Encipher"); button_des2 = new JButton("Decipher"); desPanel1.setLayout(new GridLayout(3,1)); desPanel2.setLayout(new GridLayout(3,1)); desPanel3.setLayout(new GridLayout(1,2)); desPanel1.add(jl_des1); desPanel1.add(jl_des2); desPanel1.add(jl_des3); desPanel2.add(jtf_des1); desPanel2.add(jtf_des2); desPanel2.add(jtf_des3); desPanel3.add(button_des1); desPanel3.add(button_des2); desPanel1.setLayout(new GridLayout(3,1)); desPanel2.setLayout(new GridLayout(3,1)); desPanel3.setLayout(new GridLayout(1,2)); ``` ```

JAVA图形界面关于JPanel的repaint方法重绘问题,求大神指教急急急!

在我的JFrame中加了一个JPanel,这个JPanel中包含两个JPanel,这两个JPanel同样大小,位置相同,上层那个时透明的用来显示其他控件,下层那个当背景显示图片。当我调用上层那个JPanel的repaint方法重绘时,为什么下层的JPanel也会重绘,因为考虑到每次都重绘那张图片会影响性能,所以不想让下层显示图片的JPannel重绘。看源码看到在repaint方法中好像调用了Parent.repaint方法,是不是repaint方法只要调用就父层和其他层的控件都会被重绘?

一个JFrame上添加2个JPanel之后,第一个JPanel上的画东西会在第二个JPanel上显示

![图片说明](https://img-ask.csdn.net/upload/201707/12/1499846738_463403.png) 右上角那个小的JPanel我是没有加网格的,还有就是左边那个正在掉的“L”也出现在右边了。 下面贴上我有关的代码: main方法里关于JFrame和JPanel的设置, JFrame jf=new JFrame("Tetirs"); TetirsGame game=new TetirsGame(); jf.setLayout(null);//设置为空布局,自定义 jf.getContentPane().setBackground(Color.cyan);//设置窗口的背景色 jf.setSize(600, 657);//设置窗口大小 jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jf.setAlwaysOnTop(true); jf.setLocationRelativeTo(null); game.setBackground(Color.white); game.setBounds(5, 5, WIDTH, HEIGHT);//将game放在jf的哪个位置,宽高 game.action(jf); jf.getContentPane().add(game);//将game添加到jf上 drawOther(jf,game);//画其他的JLabel等东西 jf.getContentPane().add(scbd); scbd.setBackground(Color.cyan);//scbd是一个静态的小面板的对象 scbd.setBounds(460, 50, 80, 80); 我在大的JPanel里面的定时器里调用了这个: scbd.drawScoreBoard(tetrominos[1]);//在大面板的定时器里调用小面板的画“下一个”的方法 这个方法是这样的: public void drawScoreBoard(Tetromino tero) { this.t=tero; repaint(); } public void paint(Graphics g) { if(t!=null && t.state ==Tetromino.INACTIVE) { while(t.centerCell.getRow() >60 ||t.cell_1.getRow()>60 || t.cell_2.getRow()>60 || t.cell_3.getRow()>60 ) { t.leftMove(); } while(t.centerCell.getRow() <0 ||t.cell_1.getRow() < 0 || t.cell_2.getRow()<0 || t.cell_3.getRow()<0 ) { t.rightMove(); } while(t.centerCell.getCol() >60 ||t.cell_1.getCol() >60 || t.cell_2.getCol() >60 || t.cell_3.getCol() >60 ) { t.centerCell.setCol(t.centerCell.getCol()-20); t.getTetromino(); } while(t.centerCell.getCol()<0 ||t.cell_1.getCol() <0 || t.cell_2.getCol() <0 || t.cell_3.getCol() <0 ) { t.downMove(); } BufferedImage image=t.getImage(); g.drawImage(image, t.centerCell.getRow(), t.centerCell.getCol(), null); g.drawImage(image, t.cell_1.getRow(), t.cell_1.getCol(), null); g.drawImage(image, t.cell_2.getRow(), t.cell_2.getCol(), null); g.drawImage(image, t.cell_3.getRow(), t.cell_3.getCol(), null); } } 我的game是继承了JPanel的,主要逻辑也都在这里面, 因为我要在小的JPanel里面画game里面的Tetrominos[1],而且Tetrominos[1]是不断变化的。我就在game里面的定时器里面重复调用了方法,我觉得问题可能就出在这附近,但不是很懂,请各路大神指点下咯。

Java JFrame 使用 paint 方法不显示绘制图像。

``` public class Show extends JFrame{ public Show(){ setTitle("Calcutor"); setSize(90*3,160*3); setVisible(true); } } public class Main { public static void main(String args[]){ Show show=new Show(); Graphics g= show.getGraphics(); g.setColor(Color.pink); g.fillRect(0, 0, show.getWidth(), show.getHeight()); } } ``` 上面这个不能显示图片。 ``` public class Main { public static void main(String args[]){ Show show=new Show(); Graphics g= show.getGraphics(); try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){} g.setColor(Color.pink); g.fillRect(0, 0, show.getWidth(), show.getHeight()); } } ``` 当我加上 ``` try { Thread.currentThread().sleep(1000);//毫秒 } catch(Exception e){}; ``` 时就会显示图像,这是怎么回事?能不能 不加这个也能显示图像呢?

2019 Python开发者日-培训

2019 Python开发者日-培训

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

设计模式(JAVA语言实现)--20种设计模式附带源码

设计模式(JAVA语言实现)--20种设计模式附带源码

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

java后台+微信小程序 实现完整的点餐系统

java后台+微信小程序 实现完整的点餐系统

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

初级玩转Linux+Ubuntu(嵌入式开发基础课程)

2019 AI开发者大会

2019 AI开发者大会

玩转Linux:常用命令实例指南

玩转Linux:常用命令实例指南

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

4小时玩转微信小程序——基础入门与微信支付实战

4小时玩转微信小程序——基础入门与微信支付实战

Git 实用技巧

Git 实用技巧

Python数据清洗实战入门

Python数据清洗实战入门

使用TensorFlow+keras快速构建图像分类模型

使用TensorFlow+keras快速构建图像分类模型

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

程序员的算法通关课:知己知彼(第一季)

程序员的算法通关课:知己知彼(第一季)

MySQL数据库从入门到实战应用

MySQL数据库从入门到实战应用

机器学习初学者必会的案例精讲

机器学习初学者必会的案例精讲

手把手实现Java图书管理系统(附源码)

手把手实现Java图书管理系统(附源码)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

极简JAVA学习营第四期(报名以后加助教微信:eduxy-1)

.net core快速开发框架

.net core快速开发框架

玩转Python-Python3基础入门

玩转Python-Python3基础入门

Python数据挖掘简易入门

Python数据挖掘简易入门

微信公众平台开发入门

微信公众平台开发入门

程序员的兼职技能课

程序员的兼职技能课

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

HoloLens2开发入门教程

HoloLens2开发入门教程

微信小程序开发实战

微信小程序开发实战

Java8零基础入门视频教程

Java8零基础入门视频教程

相关热词 c#跨线程停止timer c#批量写入sql数据库 c# 自动安装浏览器 c#语言基础考试题 c# 偏移量打印是什么 c# 绘制曲线图 c#框体中的退出函数 c# 按钮透明背景 c# idl 混编出错 c#在位置0处没有任何行
立即提问