.drawLine没有绘制到JTabbedPane(Java)

时间:2010-11-18 23:11:15

标签: java swing custom-component

有人告诉我一种在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)吗?

非常感谢,

2 个答案:

答案 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之前,我的帮助不大。