क्लिक किए जाने पर और फिर से आकार देने पर स्क्रॉल बार गायब हो जाता है

Scroll bar disappears when clicked and when re-sizing -> old screen stays as well as part of the new screen appears in spots. Scroll bar disappears when clicked and when re-sizing window the center panel gets distorted (keeps old stale scroll bars and messes up text)

मैं अपनी कक्षाओं में से एक के लिए एक छोटा सा स्कूल पाठ आधारित साहसिक खेल बना रहा हूं। मैं स्विंग का उपयोग करने के लिए नया हूं और मुझे अपने केंद्रीय फ्रेम पैनल में समस्याएं आ रही हैं। मेरे कोड का एकमात्र हिस्सा मुझे स्क्रॉल बार के साथ समस्याएं हैं (अपडेटस्क्रीन() और ग्राफिक व्यू() कन्स्ट्रक्टर देखें)। क्षमा करें अगर कोड का पालन करना मुश्किल है क्योंकि यह केवल कई वर्गों में से एक है और ऐसी सामग्री की टिप्पणियां हैं जिन्हें मैंने पहले कोशिश की थी कि एक ही समस्या है।

यदि आप इसे चलाने के लिए चाहते हैं तो नीचे दिए गए सरलीकृत कोड को देखें

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class GraphicView extends View {

    public static void main(String[] args)
    {
        GraphicView view = new GraphicView();
    }
    GraphicView()
    {
        frame = new JFrame();
        frame.addWindowListener(new GuiWindowListener());
        frame.setLocation(100, 200);
        frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        frame.setTitle("Nittany Cubs Gaming GUI");
        frame.setLayout(new BorderLayout());


        //JScrollPain mainPanel = new Panel();
   // mainPanel = new JPanel();
   // mainPanel.setLayout(new BorderLayout());

        //northButton = new JButton("Go North");
        //northButton.addActionListener(new NorthButtonActionListener());
        //eastButton = new JButton("Go east");
        //eastButton.addActionListener(new EastButtonActionListener());
        //southButton = new JButton("Go south");
        //southButton.addActionListener(new SouthButtonActionListener());
        //westButton = new JButton("Go west");
        //westButton.addActionListener(new WestButtonActionListener());
        //frame.add(westButton,BorderLayout.WEST);
        //frame.add(southButton,BorderLayout.SOUTH);
        //frame.add(eastButton,BorderLayout.EAST);
        //frame.add(northButton,BorderLayout.NORTH);


//      Panel southPanel = new Panel();
//      mainPanel.add(southPanel, BorderLayout.SOUTH);

   // Panel northPanel = new Panel();
   // northPanel.setSize(frame.getWidth(), 50);
   // northPanel.setBackground(Color.BLACK);
       //add north button to north panel
   // Button northButton = new Button("North Button");
   // northButton.setSize(northPanel.getWidth()-10, northPanel.getHeight()-10);
        //northButton.setSize(northPanel.getSize());
        //northButton.setBounds(new Rectangle(northPanel.getBounds()));
        //northButton.setMaximumSize(northPanel.getSize());
   // northButton.setBackground(Color.PINK);
   // northButton.addActionListener(new NorthButtonActionListener());
   // northPanel.add(northButton);
       //add north panel to main panel
   // mainPanel.add(northPanel, BorderLayout.NORTH);

        northButton = new JButton("Go North");
        northButton.addActionListener(new NorthButtonActionListener());
        frame.add(northButton, BorderLayout.NORTH);

        eastButton = new JButton("Go east");
        eastButton.addActionListener(new EastButtonActionListener());
        frame.add(eastButton, BorderLayout.EAST);

        southButton = new JButton("Go south");
        southButton.addActionListener(new SouthButtonActionListener());
        frame.add(southButton, BorderLayout.SOUTH);

        westButton = new JButton("Go west");
        westButton.addActionListener(new WestButtonActionListener());
        frame.add(westButton, BorderLayout.WEST);

        text = "";
        mainPanel = new JPanel();
        textArea = new JTextArea(text);
        textArea.setEditable(false);
        //mainPanel.add(textArea);
        //scroller = new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scroller = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        frame.add(scroller,BorderLayout.CENTER);

        updateScreen();
    }

    private static void updateScreen()
    {
   // JTextArea ta = new JTextArea(text);
        textArea = new JTextArea(text);
        //mainPanel.add(textArea);
        scroller = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        //scroller = new JScrollPane(mainPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        frame.add(scroller,BorderLayout.CENTER);
        frame.setVisible(true);

   // JScrollPane scroller = new JScrollPane(ta);
     //disables editing
    //  ta.setEditable(false);
   // scroller = new JScrollPane(ta, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
   // scroller.setBounds(3, 3, 300, 200);

   // label = new JLabel("<html>" + text + "</html>");

   // label.setLayout(new BorderLayout());

   // label.setVerticalAlignment(SwingConstants.TOP);
   // scroller = new JScrollPane(label, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

        //scroller.addMouseWheelListener(new MyMouseWheelListener());
//      scroller.createVerticalScrollBar();
//      scroller.createHorizontalScrollBar();
//      scroller.setAutoscrolls(true);


//      mainPanel.add(scroller, BorderLayout.CENTER);
//      frame.getContentPane().add(mainPanel);
//      frame.add(scroller,BorderLayout.CENTER);
//      frame.setVisible(true);
    }

    @Override
    public void informInvalidGoDirection(String direction) {
        text += "\nYou hit your nose on the wall trying to go " + direction + ". ";
        updateScreen();
    }

    @Override
    public void informPlayerMoved() {
       //TODO Auto-generated method stub

    }

    @Override
    public void look() {
       //TODO Auto-generated method stub
        Location currentLocation = Application.instance().playerCurrentLocation();
        text += currentLocation.description()  + " " + getItemsDescription(currentLocation) + " " +
                             getMobsDescription(currentLocation) + " " +
                             getCanMoveDirectionsDescription(currentLocation);
        updateScreen();
    }

    private class NorthButtonActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent ev)
        {
            Location currentLocation = Application.instance().playerCurrentLocation();
            boolean isLocationValid = Application.instance().isThereALocationNorthOf(currentLocation);
            if(isLocationValid)
            {

                Application.instance().movePlayerNorth();

                Location newLocation = Application.instance().playerCurrentLocation();
                text = newLocation.description() +
                         getItemsDescription(newLocation) +
                         getMobsDescription(newLocation) +
                         getCanMoveDirectionsDescription(newLocation);
                updateScreen();
            }
            else
            {
                informInvalidGoDirection("north");
            }
        }
    }

    private class SouthButtonActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent ev)
        {
            Location currentLocation = Application.instance().playerCurrentLocation();
            boolean isLocationValid = Application.instance().isThereALocationSouthOf(currentLocation);
            if(isLocationValid)
            {
                Application.instance().movePlayerSouth();

                Location newLocation = Application.instance().playerCurrentLocation();
                text = newLocation.description() +
                         getItemsDescription(newLocation) +
                         getMobsDescription(newLocation) +
                         getCanMoveDirectionsDescription(newLocation);
                updateScreen();
            }
            else
            {
                informInvalidGoDirection("south");
            }
        }
    }

    private class EastButtonActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent ev)
        {
            Location currentLocation = Application.instance().playerCurrentLocation();
            boolean isLocationValid = Application.instance().isThereALocationEastOf(currentLocation);
            if(isLocationValid)
            {
                Application.instance().movePlayerEast();

                Location newLocation = Application.instance().playerCurrentLocation();
                text = newLocation.description() +
                         getItemsDescription(newLocation) +
                         getMobsDescription(newLocation) +
                         getCanMoveDirectionsDescription(newLocation);
                updateScreen();
            }
            else
            {
                informInvalidGoDirection("east");
            }
        }
    }

    private class WestButtonActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent ev)
        {
            Location currentLocation = Application.instance().playerCurrentLocation();
            boolean isLocationValid = Application.instance().isThereALocationWestOf(currentLocation);
            if(isLocationValid)
            {
                Application.instance().movePlayerWest();                

                Location newLocation = Application.instance().playerCurrentLocation();
                text = newLocation.description() +
                         getItemsDescription(newLocation) +
                         getMobsDescription(newLocation) +
                         getCanMoveDirectionsDescription(newLocation);
                updateScreen();
            }
            else
            {
                informInvalidGoDirection("west");
            }
        }
    }


    private static class GuiWindowListener extends WindowAdapter
    {
        @Override
        public void windowClosing(WindowEvent ev)
        {
            ev.getComponent().setVisible(false);
            System.exit(0);
        } /* end windowClosing */
    } /* end GuiWindowListener */



    private static final int FRAME_HEIGHT = 480;
    private static final int FRAME_WIDTH = 640;
    private static JButton northButton;
    private static JButton southButton;
    private static JButton eastButton;
    private static JButton westButton;
//  private static JLabel label;
    private static String text;
    private static JPanel mainPanel;
    private static JScrollPane scroller;
    private static JFrame frame;
    private static JTextArea textArea;

}

Here is the simplified version to emphasize the problem i am having NOTE -> the scroll issue occurs until next time screenUpdate() occurs

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class GraphicViewSimplified {
    public static void main(String[] args)
    {
        GraphicViewSimplified view = new GraphicViewSimplified();
    }
    GraphicViewSimplified()
    {
        frame = new JFrame();
        frame.addWindowListener(new GuiWindowListener());
        frame.setLocation(100, 200);
        frame.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        frame.setTitle("Nittany Cubs Gaming GUI");
        frame.setLayout(new BorderLayout());

        northButton = new JButton("Go North");
   // northButton.addActionListener(new NorthButtonActionListener());
        frame.add(northButton, BorderLayout.NORTH);

        eastButton = new JButton("Go east");
   // eastButton.addActionListener(new EastButtonActionListener());
        frame.add(eastButton, Bord
0
ईडीटी पर सोएं नहीं; करें स्विंग में Concurrency देखें।
जोड़ा लेखक trashgod, स्रोत

2 उत्तर

ठीक है, मैंने अपने स्वयं के प्रश्न का उत्तर निकाला है जिसे मुझे निकालने (OldComponents) को पुनः सत्यापित करने के लिए आवश्यक है() फिर अद्यतन (स्क्रीन)() में जोड़ें (newComponent) को फिर से सत्यापित करें ()। मुझे यह काम मिल गया! फ़िर भी सहायता के लिए धन्यवाद

0
जोड़ा

सबसे पहले आप यहां EDT को अवरुद्ध करते हैं, यह सही नहीं है:

while (true) {
    updateScreen();
    try {
        Thread.sleep(1500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

उस उद्देश्य के लिए आप स्विंग <कोड> टाइमर का उपयोग कर सकते हैं, इसका उपयोग अंतराल द्वारा अपडेट करने के लिए भी किया जा सकता है, 1500 शायद एक बड़ा अंतराल, क्योंकि फ्रेम का आकार बदलते समय आपको झटके मिलते हैं।

Timer t = new Timer(1000, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
         updateScreen();
    }
});
t.start();

मेरे लिए लगता है कि आपको वास्तव में स्विंगवर्कर की आवश्यकता है। यहां इसका अच्छा उदाहरण है।

स्विंग में समेकन के बारे में पढ़ें, स्विंग <कोड> टाइमर और स्विंगवर्कर

0
जोड़ा
अच्छी तरह से मेरे वास्तविक काम में मैं किसी भी चीज के लिए टाइमर का उपयोग नहीं कर रहा हूं जो कि समस्या के एक कामकाजी उदाहरण के लिए था, मैं आपके लिए यह देखने के लिए हूं कि मैं किस बारे में बात कर रहा हूं। स्क्रीन को केवल तब अपडेट किया जाना चाहिए जब बटन क्लिक किया जाता है और प्रदर्शित टेक्स्ट बदल जाता है। स्क्रॉल अभी भी काम करना चाहिए भले ही यह सी ++ गुई के सही में लूप पर न हो?
जोड़ा लेखक JLaudio, स्रोत