Java-Paint-Methode Malt nicht?

Arbeite ich an einem kleinen einfachen swing-Komponente, und bin ich herausreißen meine Haare, um herauszufinden, warum meine paint-Methode nicht funktioniert.

Die Idee, die hinter dieser Komponente ist, dass es ein kleiner JPanel mit einem label. Der hintergrund (hinter dem Etikett) soll weiß sein, mit einem farbigen Rechteck auf der linken Seite angibt, das Verhältnis von zwei Messungen: "tatsächliche" und "erwartet".

Wenn Sie hatte ein paar von diesen Komponenten, die vertikal ausgerichtet ist, würden Sie bilden ein Balkendiagramm, bestehend aus horizontalen Balken.

Diese Art der Sache sollte sein super-einfach.

Jedenfalls, hier der code:

package com.mycompany.view;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import javax.swing.JLabel;
import javax.swing.JPanel;

public class BarGraphPanel extends JPanel {

   private static final Color BACKGROUND = Color.WHITE;
   private static final Color FOREGROUND = Color.BLACK;

   private static final Color BORDER_COLOR = new Color(229, 172, 0);
   private static final Color BAR_GRAPH_COLOR = new Color(255, 255, 165);

   private int actual = 0;
   private int expected = 1;

   private JLabel label;

   public BarGraphPanel() {
      super();
      label = new JLabel();
      label.setOpaque(false);
      label.setForeground(FOREGROUND);
      super.add(label);
      super.setOpaque(true);
   }

   public void setActualAndExpected(int actual, int expected) {
      this.actual = actual;
      this.expected = expected;
   }

   @Override
   public void paint(Graphics g) {

      double proportion = (expected == 0) ? 0 : ((double) actual) / expected;
      Rectangle bounds = super.getBounds();

      g.setColor(BACKGROUND);
      g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);

      g.setColor(BAR_GRAPH_COLOR);
      g.fillRect(bounds.x, bounds.y, (int) (bounds.width * proportion), bounds.height);

      g.setColor(BORDER_COLOR);
      g.drawRect(bounds.x, bounds.y, bounds.width, bounds.height);

      label.setText(String.format("%s of %s (%.1f%%)", actual, expected, proportion * 100));
      super.paint(g);
      g.dispose();
   }

}

Und hier ist die einfache Testumgebung:

package com.mycompany.view;

import java.awt.Dimension;
import java.awt.GridLayout;

import javax.swing.JFrame;
import javax.swing.UIManager;

public class MyFrame extends JFrame {

   public MyFrame() {
      super();
      super.setLayout(new GridLayout(3, 1));
      super.setPreferredSize(new Dimension(300, 200));

      BarGraphPanel a = new BarGraphPanel();
      BarGraphPanel b = new BarGraphPanel();
      BarGraphPanel c = new BarGraphPanel();

      a.setActualAndExpected(75, 100);
      b.setActualAndExpected(85, 200);
      c.setActualAndExpected(20, 300);

      super.add(a);
      super.add(b);
      super.add(c);
   }

   public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGUI();
         }
      });
   }

   public static void createAndShowGUI() {

      try {
         UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      } catch (Throwable t) { }

      MyFrame frame = new MyFrame();
      frame.pack();
      frame.setVisible(true);
   }

}

Die Testumgebung erzeugt einen einfachen Rahmen und fügt dann drei dieser Kontrollen.

Den Etiketten sind alle korrekt dargestellt, das zeigt mir, dass die paint () - Methode tatsächlich aufgerufen wird, aber die Rechtecke sind nicht gezeichnet wird, bis das Graphics-Objekt.

Was mache ich falsch?

... Und warum nicht Schwingen Programmierung saugen so viel?


Hier mein letzter code. Dank, jeder, für Ihre Hilfe!

public void paintComponent(Graphics g) {

   double proportion = (expected == 0) ? 0 : ((double) actual) / expected;

   Rectangle bounds = super.getBounds();

   g.setColor(BACKGROUND);
   g.fillRect(0, 0, bounds.width, bounds.height);

   g.setColor(BAR_GRAPH_COLOR);
   g.fillRect(0, 0, (int) (bounds.width * proportion), bounds.height);

   g.setColor(BORDER_COLOR);
   g.drawRect(0, 0, bounds.width - 1, bounds.height - 1);

   FontMetrics metrics = g.getFontMetrics();
   String label = String.format("%s of %s (%.1f%%)", actual, expected, proportion * 100);
   Rectangle2D textBounds = metrics.getStringBounds(label, g);

   g.setColor(FOREGROUND);
   g.drawString(label, 5, (int) ((bounds.height + textBounds.getHeight()) / 2));
}
  • Entfernen Sie "super.paint(g)" und "g".dispose()" und sehen, was passiert.
  • Interessant. Wenn ich entfernen Sie "super.paint(g)" und "g".dispose()", dann bekomme ich den richtigen hintergrund Rechtecke, aber ich verliere die Darstellung der label in den Vordergrund.
  • Hmm... wie Sie darum, eine "super.paint(g)", bevor Sie malen die bars? Alternativ können Sie "g".drawString ()", um die Darstellung von text.
InformationsquelleAutor benjismith | 2009-02-02
Schreibe einen Kommentar