如何从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:看看最新的答案。