Java swing: я однажды позвонил drawString, и он несколько раз напечатал мою строку - PullRequest
0 голосов
/ 29 апреля 2020

Я новичок в java программировании свинга. То, что я пытаюсь сделать, это нарисовать строку в указанное c местоположение в JPanel. JPanel очень большой, поэтому я добавляю его в JScrollpane, но когда я рисую строку, она печатается не только в указанном месте, но и в других. Первое изображение представляет нижнюю часть панели, где я решил нарисовать строку, и это правильно. Но если вы наблюдаете всю панель, вы можете найти строку и в других местах (см. Второе изображение). Может кто-нибудь сказать мне, почему это произошло? Как я могу предотвратить это? enter image description here

enter image description here

import java.util.*; 
import java.io.*;
import javax.swing.*;
import java.awt.*;
class Example extends JFrame
{
    private MyPanel gg=new MyPanel();
    Example(){
        add(new JScrollPane(gg));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setExtendedState(MAXIMIZED_BOTH);
    }
    public static void main(String argv[]){
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                Example test=new Example();
                test.setVisible(true);
            }
        });
        return;
    }
}
class MyPanel extends JPanel
{
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d=(Graphics2D)g;
        g2d.drawString("HI I LOVE ELON MUSK", 90, 300035);
        return;
    }
    public Dimension getPreferredSize() {
        return new Dimension(500, 300060);
    }
}

1 Ответ

0 голосов
/ 29 апреля 2020

Ваш код работал нормально на моей Windows 10 системе. У меня есть Java 13 JDK, который я компилирую в Java 8.

Я внес несколько изменений в ваш основной класс. Возможно, эти изменения стабилизировали дисплей. Запустите мой код в вашей системе и посмотрите.

import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class LongJPanelExample {

    public LongJPanelExample() {
        JFrame frame = new JFrame("Long JPanel Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyPanel gg = new MyPanel();
        frame.add(new JScrollPane(gg));

        frame.pack();
        frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
        frame.setVisible(true);
    }

    public static void main(String argv[]) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new LongJPanelExample();
            }
        });
    }
}

class MyPanel extends JPanel {
    private static final long serialVersionUID = 1L;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawString("HI I LOVE ELON MUSK", 90, 300035);
        return;
    }

    public Dimension getPreferredSize() {
        return new Dimension(500, 300060);
    }
}
...