Как вызвать метод переопределения из объекта [duplicate]

, если вы используете jquery, вы можете сделать это следующим образом.

$('textarea').prop('selectionEnd', 13);
3
задан Jason Braucht 20 April 2012 в 03:36
поделиться

3 ответа

Чтобы ваше приложение Swing работало так, как ожидалось, есть много вещей, которые вам нужно иметь в виду. Всегда есть определенные шаги, которые нужно выполнить, чтобы избежать определенных препятствий, которые могут возникнуть, поскольку вы неправильно закодированы. Для этого придерживайтесь основ программирования Swing строго и следуйте им.

  • Как и упоминалось @HovercraftFullOfEels, вы вызываете прямо на свою графику, чего никогда не следует делать.
  • Во-вторых, посмотрите на свой конструктор GameFrame(), вы его установили до видимости, даже до того, как вы добавили к нему какие-либо компоненты и многое другое, пока не будет установлен реальный размер

. Такие петлевые отверстия внутри вашего кодирования могут вызвать множество головных болей, поскольку вы сидите вниз, чтобы писать огромные программы, поэтому лучше быть на безопасной дороге с самого начала, а затем проклинать себя на более позднем этапе. Как говорится, профилактика лучше, чем Cure.

Теперь, приходя к вашей программе, вы пропустили главное, поскольку вы не указали размер вашего CustomComponent, то есть JComponent, следовательно, вы не были который можно увидеть на экране. По мере того, как вы расширяете JCompoent до вашего класса, сделайте обычным привычку переопределять его getPreferredSize () , таким же образом вы переопределите его метод paintComponent(...).

Have Посмотрите на эту небольшую программу, которую я создал для вас, возможно, это поможет вам понять, понять логику немного больше.

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

public class CustomPainting {

    private RectangleComponent life;
    private RectangleComponent death;

    private void createAndDisplayGUI() {
        JFrame frame = new JFrame("Custom Painting");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(0, 2, 5, 5));
        // Specifying the WIDTH, HEIGHT and Colour for this JComponent.
        life = new RectangleComponent(Color.GREEN.darker(), 20, 20);
        death = new RectangleComponent(Color.RED.darker(), 20, 20);
        centerPanel.add(life);
        centerPanel.add(death);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 5, 5));
        JButton incLifeButton = new JButton("INCREASE LIFE");
        incLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                life.addLife(1);
            }
        });

        JButton decLifeButton = new JButton("DECREASE LIFE");
        decLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                life.subtractLife(1);
            }
        });

        JButton incDeathButton = new JButton("INCREASE DEATH");
        incDeathButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                death.addLife(1);
            }
        });

        JButton decDeathButton = new JButton("DECREASE DEATH");
        decDeathButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                death.subtractLife(1);
            }
        }); 

        buttonPanel.add(incLifeButton);
        buttonPanel.add(decLifeButton);
        buttonPanel.add(incDeathButton);
        buttonPanel.add(decDeathButton);

        frame.getContentPane().add(centerPanel, BorderLayout.CENTER);
        frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String\u005B\u005D args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CustomPainting().createAndDisplayGUI();
            }
        });
    }
}

class RectangleComponent extends JComponent {

    private Color colour;
    private static final int MARGIN = 10;
    private int width;
    private int height;
    private int originalWidth;
    private RoundRectangle2D roundedRectangle;

    public RectangleComponent(Color c, int w, int h) {
        colour = c;
        width = w;
        height = h;
        originalWidth = width;
    }

    /*
     * Overriding this method, so that
     * the size of the JComponent
     * can be determined, on the screen
     * or by the LayoutManager concern.
     */
    @Override 
    public Dimension getPreferredSize() {
        return (new Dimension(width, height));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        roundedRectangle = new RoundRectangle2D.Float(MARGIN, MARGIN,
                                        width, height, MARGIN, MARGIN);
        g2d.setPaint(colour);
        g2d.draw(roundedRectangle);
        g2d.fill(roundedRectangle);
    }

    public void subtractLife(int amount) {
        width -= amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width : " + width);
        if (width > 0) {
            roundedRectangle.setRoundRect(MARGIN, MARGIN, width, height,
                                            MARGIN, MARGIN);
            /*
             * This repaint() will call the paintComponent(...)
             * by itself, so nothing else to be done.
             */
            repaint();
        } else {
            width += amount;
        }
    }

    public void addLife(int amount) {
        width += amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width : " + width);
        if (width < originalWidth) {
            roundedRectangle.setRoundRect(MARGIN, MARGIN, width, height,
                                            MARGIN, MARGIN);
            repaint();
        } else {
            width -= amount;
        }
    }
}

Задавайте любой вопрос, который может возникнуть как вы проходите эту программу :-), я с радостью помогу в этом: -)

** ПОСЛЕДНИЕ ИЗМЕНЕНИЯ С ДВУМЯ ЦВЕТАМИ: **

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

public class CustomPainting {

    private RectangleComponent lifeDeath;

    private void createAndDisplayGUI() {
        JFrame frame = new JFrame("Custom Painting");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(0, 2, 5, 5));
        // Specifying the WIDTH, HEIGHT and Colour for this JComponent.
        lifeDeath = new RectangleComponent(Color.GREEN, Color.RED, 20, 20);
        centerPanel.add(lifeDeath);

        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(1, 2, 5, 5));
        JButton incLifeButton = new JButton("INCREASE LIFE");
        incLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                lifeDeath.addLife(1);
            }
        });

        JButton decLifeButton = new JButton("DECREASE LIFE");
        decLifeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                lifeDeath.subtractLife(1);
            }
        });

        buttonPanel.add(incLifeButton);
        buttonPanel.add(decLifeButton);

        frame.getContentPane().add(centerPanel, BorderLayout.CENTER);
        frame.getContentPane().add(buttonPanel, BorderLayout.PAGE_END);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String\u005B\u005D args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CustomPainting().createAndDisplayGUI();
            }
        });
    }
}

class RectangleComponent extends JComponent {

    private Color lifeColour;
    private Color deathColour;
    private static final int MARGIN = 10;
    private int widthLife;
    private int widthDeath;
    private int height;
    private int originalWidth;
    private RoundRectangle2D roundedRectangle;

    public RectangleComponent(Color lc, Color dc, int w, int h) {
        lifeColour = lc;
        deathColour = dc;
        widthLife = w;
        height = h;
        originalWidth = widthLife;
        widthDeath = 0;     
    }

    /*
     * Overriding this method, so that
     * the size of the JComponent
     * can be determined, on the screen
     * or by the LayoutManager concern.
     */
    @Override 
    public Dimension getPreferredSize() {
        return (new Dimension(originalWidth, height));
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;

        roundedRectangle = new RoundRectangle2D.Float((MARGIN + widthDeath), MARGIN,
                                        widthLife, height, MARGIN, MARGIN);
        g2d.setPaint(lifeColour);
        g2d.draw(roundedRectangle);
        g2d.fill(roundedRectangle);

        roundedRectangle.setRoundRect(MARGIN, MARGIN,
                                        widthDeath, height, MARGIN, MARGIN);
        g2d.setPaint(deathColour);
        g2d.draw(roundedRectangle);
        g2d.fill(roundedRectangle);
    }

    public void subtractLife(int amount) {
        widthLife -= amount;
        widthDeath += amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width Life : " + widthLife);
        System.out.println("Width Death : " + widthDeath);
        if (widthLife > 0 && widthDeath < originalWidth) {
            /*
             * This repaint() will call the paintComponent(...)
             * by itself, so nothing else to be done.
             */
            repaint();
        } else {
            widthLife += amount;
            widthDeath -= amount;
        }
    }

    public void addLife(int amount) {
        widthLife += amount;
        widthDeath -= amount;
        System.out.println("ORIGINAL Width : " + originalWidth);
        System.out.println("Width Life : " + widthLife);
        System.out.println("Width Death : " + widthDeath);
        if (widthLife < originalWidth && widthDeath > 0) {
            repaint();
        } else {
            widthLife -= amount;
            widthDeath += amount;
        }   
    }
}
3
ответ дан nIcE cOw 19 August 2018 в 02:37
поделиться
  • 1
    Мне нравятся изменения, которые вы внесли в мой вычитание, и добавьте методы жизни, они идеальны! Еще одна вещь, хотя, когда я создаю свои 2 прямоугольника, они разнесены друг от друга, несмотря на то, что они построены с одинаковыми размерами. Как я могу сделать так, чтобы смерть была за жизнью, и они находятся на одном и том же месте? – keyert 23 April 2012 в 01:54
  • 2
    Я думаю, что вы прокомментировали это право, когда я сделал свое редактирование выше, вы видели, что я добавил к нему? Благодарю. – keyert 23 April 2012 в 02:26
  • 3
    Я пропустил это новое редактирование :( Ты хочешь сказать, один поверх другого? – nIcE cOw 23 April 2012 в 03:21
  • 4
    Почему бы не вместо добавления двух вы сделать один и просто покрасить его двумя разными цветами (RED and GREEN) в зависимости от ширины и высоты соответствующего цвета? – nIcE cOw 23 April 2012 в 03:40
  • 5

Не нужно передавать JPanel в конструктор RectangleComponent, чтобы получить Graphics, и не нужно вручную вызывать paintComponent. См. Покраска в AWT и Swing . Проверьте этот пример , который демонстрирует пользовательский компонент, который рисует прямоугольник.

3
ответ дан Community 19 August 2018 в 02:37
поделиться
  • 1
    +1 для TIP и соответствующей ссылки на указанный источник :-) – nIcE cOw 20 April 2012 в 08:38

Ваш код немного креативен, немного сумасшедший и с логикой, с которой очень сложно следовать. Самый необычный аспект заключается в том, что он имеет два JFrames, один называется «frame», и один сам объект GameFrame, оба из которых добавляют компоненты, но только один из них показывает. У вас также есть много методов, которые возвращают void (что при чрезмерном использовании увеличивает запах кода) и только добавляет, чтобы сделать код более запутанным.

Например,

public GameFrame(char x) {

  // here you set up the "frame" JFrame
  frame.setSize(1024, 768);
  frame.setTitle("Game");
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  frame.setVisible(true);
  FlowLayout layout = new FlowLayout();
  createPanels(x);
  healthPanel.setLayout(layout);
  buttonPanel.setLayout(layout);
  mainPanel.setLayout(layout);

  // here you add content to the frame JFrame, and pack it
  frame.getContentPane().add(mainPanel);
  frame.pack();
  repaint();  // and then call repaint on the "this" JFrame?
}

public RectangleComponent getLife() {
  return life;
}

private void createHealth() {
  life = new RectangleComponent(green, healthPanel);
  death = new RectangleComponent(red, healthPanel);
}

private void createPanels(char x) {
  add(healthPanel); // now you add content to the "this" JFrame
  pack();  // and pack it
  createBar(x);
  createHealth();
  mainPanel.add(buttonPanel);
  mainPanel.add(healthPanel); // and then re-add a JPanel into a second JPanel?
  healthPanel.add(death);
  healthPanel.add(life);
  buttonPanel.add(bar.getSpell1());
  buttonPanel.add(bar.getSpell2());
  buttonPanel.add(bar.getSpell3());
  add(mainPanel); // and then re -add the mainPanel into the "this" JFrame???
}

Это все очень запутанное и вряд ли сработает.

Затем вы пытаетесь напрямую вызвать paintComponent и вызывать getGraphics на JComponent, оба из которых не должны выполняться.

Я рекомендую рассмотреть возможность повторного написания этого и, прежде всего, использовать только один JFrame и лучше организовать ваш код.

3
ответ дан Hovercraft Full Of Eels 19 August 2018 в 02:37
поделиться
  • 1
    +1 за замечательную часть, которую вы поделили своими знаниями (10 из 10) :-) – nIcE cOw 20 April 2012 в 08:37
  • 2
    Я не использую более одного JFrame для игры. У меня есть экран заголовка, который является фреймом, а затем у меня есть отдельный кадр, который является реальной игрой. Я хочу 2 кадра, потому что тогда вы можете снова открыть новую игру с экрана заголовка после того, как закончите с текущей игрой. – keyert 22 April 2012 в 22:32
  • 3
    @keyert: Это не имеет ничего общего с заголовком scrren. Вы не хотите, чтобы два JFrames были написаны в коде выше, особенно если вы не добавляете одни и те же объекты компонентов к обоим. Опять же, код в вашем оригинальном посте немного шизофреник. – Hovercraft Full Of Eels 22 April 2012 в 22:59
  • 4
    Ahhhhh, я вижу. Мне не нужен неявный параметр для любого вызова кадра, и мне не нужно отдельное поле экземпляра JFrame. Спасибо, что указали это. – keyert 23 April 2012 в 02:18
Другие вопросы по тегам:

Похожие вопросы: