Java Synth: проблема с JTabbedPane и SynthGraphicsUtils - PullRequest
0 голосов
/ 26 сентября 2010

в моем Java-приложении у меня есть JTabbedPane и синтезатор.L & F определяется XML-файл.Это работает очень хорошо для меня.

Теперь проблема: я хочу, чтобы текст на вкладках JTabbedPane был написан вертикально, а не горизонтально.Для этого я вложил в класс SynthGraphicsUtils и переписал метод paintText (SynthContext ss, Graphics g, String text, int x, int y, int mnemonicIndex).Это также работает.

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

Я не знаю, как решить эту проблему :-( Вот мой код:

SwingTest.java

public SwingTest(JFrame owner) {

    super(null);

    setOpaque(true);
    setSize(WIDTH, HEIGHT);
    owner.setSize(WIDTH, HEIGHT);

    JTabbedPane pane = new JTabbedPane(JTabbedPane.LEFT);
    pane.setName("MyPane");
    pane.setSize(WIDTH, HEIGHT);

    // Add a tab
    JPanel p1 = new JPanel();
    p1.setSize(300, 300);

    JPanel p2 = new JPanel();
    p2.setSize(500, 500);

    JPanel p3 = new JPanel();
    p3.setSize(300, 300);

    p3.add(new JLabel("HALLO"));

    JPanel p4 = new JPanel();
    p4.setSize(300, 300);

    JButton roundedButton = new JButton("Halloi Button");
    roundedButton.setName("roundedButton");

    p2.add(roundedButton);

    pane.addTab(EFFORT_CARD, p1);
    pane.addTab(EMOTION_CARD, p2);
    pane.addTab(COMFORT_CARD, p3);      
    pane.addTab(DRIVING_CARD, p4);

    add(pane);

    pane.updateUI();

laf.xml

<!-- 
TABNAVIGATION
 -->
<style id="tabNavigationStyle">
    <!-- Angabe ist wichtig, da die Hintergrundfarben sonst nicht angezeigt
    werden. -->
    <!-- <object id="verticalTextWriterClass" class="VerticalTextWriter" />
    <painter method="text" idref="verticalTextWriterClass"/> -->
    <opaque value="TRUE" />
    <state>
        <font name="Verdana" size="12" />
        <color value="WHITE" type="BACKGROUND" />
        <color value="BLACK" type="FOREGROUND" />
        <color value="BLUE" type="TEXT_FOREGROUND" />
        <object id="myGraphicsUtils" class="MySynthGraphicsUtils" />
        <graphicsUtils idref="myGraphicsUtils" />
    </state>
    <!-- Fuer den Zustand "SELECTED" einen anderen Style definieren. -->
    <state value="SELECTED">
        <!-- Auf weiter oben definierte Farbe beziehen. -->
        <color value="WHITE" type="BACKGROUND" />
        <color idref="magentaForegroundColor" type="TEXT_FOREGROUND" />
    </state>
    <state value="FOCUSED">
        <!-- Auf weiter oben definierte Farbe beziehen. -->
        <color value="WHITE" type="BACKGROUND" />
        <color idref="magentaForegroundColor" type="TEXT_FOREGROUND" />
    </state>
    <state value="PRESSED">
        <!-- Auf weiter oben definierte Farbe beziehen. -->
        <color value="WHITE" type="BACKGROUND" />
        <color idref="magentaForegroundColor" type="TEXT_FOREGROUND" />
    </state>
</style>
<!-- Den Style fuer die Tabnavigation an die Tabnavigation mit dem Namen (type="name")
"MyPane" binden. Der Name wird in Java ueber component.setName() festgelegt. -->
<bind style="tabNavigationStyle" type="region" key="TabbedPaneTab" />

MySynthGraphicsUtils.java

public class MySynthGraphicsUtils extends SynthGraphicsUtils {
public void paintText(SynthContext ss, Graphics g, String text, int x, int y, int mnemonicIndex) {

    Graphics2D g2 = (Graphics2D) g;

    System.out.println(ss.getComponent().getClass().getName());

    Object oldAAValue = g2.getRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING);
    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);

    g2.setFont(ss.getStyle().getFont(ss));
    AffineTransform tx = new AffineTransform();
    tx.rotate(90 * Math.PI / 180, x, y);
    g2.setTransform(tx);

    g2.drawString(text, x, y);

    // get metrics from the graphics
    FontMetrics metrics = g2.getFontMetrics(ss.getStyle().getFont(ss));
    // get the height of a line of text in this font and render context
    int hgt = metrics.getHeight();
    // get the advance of my text in this font and render context
    int adv = metrics.stringWidth(text);
    // calculate the size of a box to hold the text with some padding.
    Dimension size = new Dimension(adv + 2, hgt + 2);

    //g2.setClip(0, 0, size.width, size.height);

    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, oldAAValue);
}

}

Большое спасибо !!

1 Ответ

1 голос
/ 12 апреля 2011

В качестве обходного пути я использую границу изображения с sourceInset на левой стороне для разделения вкладок. Я делаю изображение того же цвета, что и фон приложения:

        <state>
                <opaque value="true"/>
                <color value="black" type="BACKGROUND" />
                <color value="white" type="TEXT_FOREGROUND" />
                <imagePainter method="tabbedPaneTabBorder" path="relative/path/to/white_border.png"
             sourceInsets="0 1 0 0" paintCenter="false"/>
                <insets top="3" bottom="3" right="3" left="3"/>
        </state>
...