【问题标题】:.drawLine is not drawing onto JTabbedPane (Java).drawLine 未绘制到 JTabbedPane (Java)
【发布时间】:2010-11-18 23:11:14
【问题描述】:

有人告诉我一种在 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) 上绘制该行?

【问题讨论】:

    标签: java swing custom-component


    【解决方案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();
    

    会变成:

    JPanel  loginMainPanel = new CustomPanel();
    

    【讨论】:

    • 好的,非常感谢,您知道如何将它放在/任何文本框/按钮框等上方吗?谢谢。
    • 另外,如果我想稍后在程序中使用 .drawLine(不同的坐标),我将如何调用受保护的 void?例如在/点击按钮
    • @James,您可能不应该将面板上的自定义绘图与 LayoutManager 布局组件混合在一起。对于您的第一个问题,您需要将组件布置在单独的 JPanel 上,该 JPanel 位于您正在绘制的 JPanel 下方。
    • @James,以及您的第二个问题。您不会直接调用paintComponent 方法。您应该向CustomPanel 添加一个自定义方法,称为drawLine(boolean true)。然后让该方法设置一个布尔标志。每当重新绘制组件时都会调用paintComponent 方法,因此您需要根据您设置的布尔标志将对g.drawLine 的调用放在if 块中。
    【解决方案2】:

    对于臃肿代码的模糊感到抱歉

    是的,这就是人们无法解决问题的原因,因为代码太臃肿了,你看不到自己在做什么。

    如果您希望我们帮助您解决问题,那么您需要发帖 SSCCE

    有人告诉我一种在 Jframe 上绘画的方法

    嗯,这是错误的,一般来说你不应该覆盖paint() 方法,除非你有特定的原因。

    此外,您的整个程序都是错误的,因为您正在扩展 JTabbedPane。您永远不应该这样做来创建 GUI。

    您的 paint() 方法永远不会被调用,因为您永远不会在任何地方使用该类。看看你的代码。为您的类变量创建一个新的 JTabbedPane。然后在构造函数中将所有这些组件添加到框架中并使框架可见。

    您需要查看Swing tutorial 并按照其中的一些示例来更好地创建简单的 GUI。

    我不明白您在选项卡式窗格上画一条线是要做什么。每次单击选项卡时,选项卡式窗格都会显示不同的面板。您究竟希望线条出现在哪里?

    此外,您应该学习如何使用布局管理器。使用空布局会导致不必要的问题。

    在您发布 SSCCE 之前,我帮不上什么忙。

    【讨论】:

    • 我只想在登录选项卡/面板/窗格/窗口/事物上直观地显示一行。
    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 2018-03-02
    • 2018-03-17
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多