Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java中的另一个类访问paintComponent()?_Java_Swing_Jframe_Jpanel_Extends - Fatal编程技术网

如何从Java中的另一个类访问paintComponent()?

如何从Java中的另一个类访问paintComponent()?,java,swing,jframe,jpanel,extends,Java,Swing,Jframe,Jpanel,Extends,因此,我的主类扩展了JFrame,第二个类扩展了JPanel,允许paintComponent在JPanel上绘制。但是如何访问新类以在JPanel上绘制呢 这是我的密码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class MTGSAMPServerReference extends JFrame implements Actio

因此,我的主类扩展了
JFrame
,第二个类扩展了
JPanel
,允许
paintComponent
JPanel
上绘制。但是如何访问新类以在
JPanel
上绘制呢

这是我的密码:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class MTGSAMPServerReference extends JFrame implements ActionListener {
    public static Toolkit tk = Toolkit.getDefaultToolkit(); 
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth());
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight());
    private static final long serialVersionUID = 1L;
    private static JList list1;
    private static JButton next;
    private static JPanel bg = new JPanel();

    public MTGSAMPServerReference() {
        // set flow layout for the frame
        this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
        Object[]mainData = {"Vehicles", "Bikes/Bicycles", "Boats", "Houses", "Businesses", "Objects", "Jobs", "Ranks", "Licenses", "VIP"};
        JPanel controls = new JPanel(new BorderLayout(5,5));
        list1 = new JList<Object>(mainData);
        list1.setVisibleRowCount(10);
        next = new JButton("Next");
        next.addActionListener(this);
        controls.add(new JScrollPane(list1));
        controls.add(next, BorderLayout.PAGE_END);
        controls.setBorder(new EmptyBorder(25,25,0,0));
        add(controls);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Next")) {
            int index = list1.getSelectedIndex();
            System.out.println("Index Selected: " + index);
            String s = (String) list1.getSelectedValue();
            System.out.println("Value Selected: " + s);
        }
    }

    public void createAndShowGUI() {
        //Create and set up the window.
        JFrame f = new MTGSAMPServerReference();
        //Display the window.
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setSize(1200, 800);
        f.setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        next.setSize(75, 25);
        next.setLocation(251, 276);
        MTGSAMPServerReference.this.repaint();
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            MTGSAMPServerReference gui = new MTGSAMPServerReference();
            gui.createAndShowGUI();
            }
        });
    }
}

class drawOnPanel extends JPanel {
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawRect(0, 0, 50, 50);
    }
}
import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.border.*;
公共类MTGSAMPServerReference扩展JFrame实现ActionListener{
公共静态工具箱tk=Toolkit.getDefaultToolkit();
静态int-ScrnWidth=((int)tk.getScreenSize().getWidth());
静态int-ScrnHeight=((int)tk.getScreenSize().getHeight());
私有静态最终长serialVersionUID=1L;
私有静态JList列表1;
私有静态JButton next;
私有静态JPanel bg=newjpanel();
公共MTGSAMPServerReference(){
//设置框架的流布局
this.getContentPane().setLayout(新的FlowLayout(FlowLayout.LEADING));
Object[]mainData={“车辆”、“自行车/自行车”、“船只”、“房屋”、“企业”、“对象”、“工作”、“等级”、“许可证”、“VIP”};
JPanel控件=新JPanel(新边界布局(5,5));
列表1=新的JList(主数据);
列表1.setVisibleRowCount(10);
下一步=新的按钮(“下一步”);
next.addActionListener(这个);
添加(新的JScrollPane(列表1));
控件。添加(下一步,BorderLayout.PAGE_END);
控制。设定顺序(新的清空顺序(25,25,0,0));
添加(控制);
}
@凌驾
已执行的公共无效操作(操作事件e){
如果(例如getActionCommand().equals(“下一步”)){
int index=list1.getSelectedIndex();
System.out.println(“所选索引:“+Index”);
字符串s=(字符串)list1.getSelectedValue();
System.out.println(“所选值:+s”);
}
}
public void createAndShowGUI(){
//创建并设置窗口。
JFrame f=新的MTGSAMPServerReference();
//显示窗口。
f、 包装();
f、 setVisible(真);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 设置大小(1200800);
f、 setLocationRelativeTo(空);
列表1.设置大小(250250);
列表1.设置位置(0,0);
接下来,设置大小(75,25);
接下来,设置位置(251276);
MTGSAMPServerReference.this.repaint();
}
公共静态void main(字符串[]args){
javax.swing.SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
MTGSAMPServerReference gui=新的MTGSAMPServerReference();
createAndShowGUI();
}
});
}
}
类drawOnPanel扩展了JPanel{
受保护组件(图形g){
超级组件(g);
图形2d g2=(图形2d)g;
g2.setRenderingHint(renderingHits.KEY\u ANTIALIASING,renderingHits.VALUE\u ANTIALIAS\u ON);
g2.drawRect(0,0,50,50);
}
}
有什么想法吗


提前谢谢

您只需像添加任何其他组件一样添加面板。重新绘制时调用
paintComponent
方法。

您没有将
drawOnPanel
类添加到框架的容器中。添加此行:

add(new drawOnPanel());

附加注释

  • createAndShowGUI()
    内部,您的类已从
    JFrame
    扩展,无需创建另一个
    JFrame
    对象,将其更改为:

       public void createAndShowGUI() {
        //Create and set up the window.
        //JFrame f = new MTGSAMPServerReference();
        //Display the window.
    
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(1200, 800);
        setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        next.setSize(75, 25);
        next.setLocation(251, 276);
        repaint();
        pack();
    }
    
  • 在重新绘制后选择
    pack()
    方法,以适合组件的大小,正如我在上面所做的那样


  • @knorberg的评论:这个矩形是在哪里画的,又是如何画的

    您的绘图很好,只需在
    drawOnPanel
    类中重写
    getPreferredSize()
    方法:

    class drawOnPanel extends JPanel {
      @Override
      protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            g2.drawRect(0, 0, 50, 50);
        }
      @Override
      public Dimension getPreferredSize(){
        return new Dimension(200,200);
      }
    }
    

    哦,布局问题解决了!你似乎在执行一项任务,让在线社区为你编写应用程序。这个应用程序是什么?我看过几篇与之相关的帖子。@tbodt不,我只是想学习,当我遇到问题时,我用谷歌搜索它,做一些研究,看看自己能做些什么。当我撞墙时,我请求帮助。最近,虽然它不仅仅是一堵墙,更像是一座塔:我只需要能够越过这个障碍,然后我就应该是金色的!你到底在写什么
    MTGSAMPServerReference
    不是什么提示。它是我所在社区的重要参考指南。更多的是一个交互式指南。我如何从其他类访问它?为什么您希望从其他类访问它?你会让容器调用它来绘制它。你看了我的代码了吗?你在给框架添加面板的实例吗?这很重要。如果是,请准确告诉我什么不起作用。您没有更改代码吗?您需要将面板的实例添加到框架中。该实例在何处以及如何绘制我的矩形<代码>g2.drawRect(0,0,50,50)还有,有人告诉我不要在JFrame上画画,而要用JPanel。@knorberg:你的画很好,只要在
    drawOnPanel
    类中重写`getPreferredSize()`方法并为它设置一些维度,如果你不知道,我会更新我的答案。我不明白你的意思。能再解释一点吗?@knorberg:看看最新的答案。