有人告诉我一种在Jframe上绘画的方法,并且它在示例中运行良好,但现在我有标签它没有画到它们上面......
很抱歉臃肿的代码模糊但我需要paint / drawLine才能在我的选项卡示例中运行...
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.io.*;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
public class GUI extends JTabbedPane implements ActionListener
{
static JFrame aWindow = new JFrame("Project");
JTabbedPane myTabs = new JTabbedPane();
JPanel loginMainPanel = new JPanel();
JPanel displayMainPanel = new JPanel();
JPanel editMainPanel = new JPanel();
JTextField myText1 = new JTextField("");
JTextField myText2 = new JTextField("");
JTextField myText3 = new JTextField("");
JLabel loginLabel = new JLabel("Username:");
JTextField loginField = new JTextField();
JLabel loginLabel2 = new JLabel("Password:");
JPasswordField loginPass = new JPasswordField();
JButton displayButton = new JButton("Load Data");
JButton loginButton = new JButton("Login");
JLabel editLabel = new JLabel("Write:");
JTextArea editArea = new JTextArea();
public GUI()
{
Toolkit theKit = aWindow.getToolkit();
Dimension wndSize = theKit.getScreenSize();
aWindow.setBounds(wndSize.width/3, wndSize.height/3, 250, 250);
aWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
GridLayout grid = new GridLayout(1,1);
Container content = aWindow.getContentPane();
content.setLayout(grid);
createLoginPanel();
createDisplayPanel();
createEditPanel();
myTabs.addTab("Login", loginMainPanel);
myTabs.addTab("Main Menu", displayMainPanel);
myTabs.addTab("Setting", editMainPanel);
myTabs.setSelectedIndex(0);
myTabs.setEnabledAt(1,false);
myTabs.setEnabledAt(2,false);
content.add(myTabs);
aWindow.setVisible(true);
}
public void createLoginPanel()
{
loginMainPanel.setLayout(null);
loginLabel.setBounds(10, 15, 150, 20);
loginMainPanel.add(loginLabel);
loginField.setBounds(10, 35, 150, 20);
loginMainPanel.add(loginField);
loginLabel2.setBounds(10, 60, 150, 20);
loginMainPanel.add(loginLabel2);
loginPass.setBounds(10, 80, 150, 20);
loginMainPanel.add(loginPass);
loginButton.addActionListener(this);
loginButton.setBounds(50, 110, 80, 20);
loginMainPanel.add(loginButton);
}
public void createDisplayPanel()
{
displayMainPanel.setLayout(null);
displayButton.addActionListener(this);
displayButton.setBounds(50, 80, 150, 20);
displayMainPanel.add(displayButton);
myText1.setBounds(50, 170, 200, 30);
myText2.setBounds(50, 140, 200, 30);
myText3.setBounds(50, 110, 200, 30);
displayMainPanel.add(myText1);
displayMainPanel.add(myText2);
displayMainPanel.add(myText3);
}
public void createEditPanel()
{
editMainPanel.setLayout(null);
editLabel.setBounds(10, 15, 150, 20);
editMainPanel.add(editLabel);
editArea.setBounds(10, 65, 150, 50);
editMainPanel.add(editArea);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == loginButton)
{
//myTabs.setSelectedIndex(1);
}
}
public void paint(Graphics g) {
super.paint(g);
int locX = 0;
int locY = 0;
int destX = 210;
int destY = 210;
g.setColor(Color.red);
// draw a line (there is now drawPoint..)
g.drawLine(locX, locY, destX, destY);
}
public static void main(String[] args)
{
GUI tw1 = new GUI();
}
}
任何人都可以找到问题/提供解决方案,以便在选项卡上绘制该行(loginMainPanel)吗?
非常感谢,
答案 0 :(得分:1)
如果你想在JPanel上自定义绘图,你应该创建一个扩展JPanel的自定义类:
class CustomPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(x1, y1, x2, y2);
}
}
然后:
JPanel loginMainPanel = new JPanel();
Woudl成为:
JPanel loginMainPanel = new CustomPanel();
答案 1 :(得分:1)
对于臃肿代码的模糊感到抱歉
是的,这就是人们无法解决问题的原因,因为代码太臃肿,你无法看到你在做什么。
如果您希望我们帮助您解决问题,那么您需要发布SSCCE
有人告诉我一种画在Jframe上的方法
嗯,这是错误的,一般情况下你不应该覆盖paint()方法,除非你有特定的理由。
此外,您的整个程序错误,因为您正在扩展JTabbedPane。你永远不应该这样做来创建一个GUI。
永远不会调用paint()方法,因为您从不在任何地方使用该类。看看你的代码。对于类变量,您可以创建一个新的JTabbedPane。然后在构造函数中将所有这些组件添加到框架中并使框架可见。
您需要查看Swing tutorial并按照其中的一些示例,以便更好地创建简单的GUI。
通过在选项卡式窗格上绘制一条线,我不明白您要做什么。每次单击选项卡时,选项卡式窗格都会显示不同的面板。你想要在哪里出现这条线?
此外,您还应该学习如何使用布局管理器。使用null布局会导致不必要的问题。
在你发布SSCCE之前,我的帮助不大。