2016-02-16 4 views
4

Две иконки отображаются при использовании JMenuItemsetHorizontalTextPosition(SwingConstants.LEFT) с Windows Look and Feel. Он отлично работает со стандартным Java Look и Feel.Двойные значки с JMenuItem setHorizontalTextPosition на Win

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

У кого-нибудь есть обходное решение? Благодарю.

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.image.BufferedImage; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JMenu; 
import javax.swing.JMenuBar; 
import javax.swing.JMenuItem; 
import javax.swing.SwingConstants; 
import javax.swing.UIManager; 


public class WinMenuItemIcon { 

public static void main(String[] args) { 

    //NOTE: Bug happens with Windows L&F 
    String name = UIManager.getSystemLookAndFeelClassName(); 
    try { 
     UIManager.setLookAndFeel(name); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    JFrame frame = new JFrame(); 
    frame.setTitle("Test"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JMenuBar menuBar = new JMenuBar(); 
    JMenu menu = new JMenu("Menu"); 

    ImageIcon icon = createIcon(); 

    JMenuItem menuItem = new JMenuItem("Command", icon); 
    menuItem.setHorizontalTextPosition(SwingConstants.LEFT); 
    menu.add(menuItem); 
    menuBar.add(menu); 

    frame.setJMenuBar(menuBar); 
    frame.setPreferredSize(new Dimension(500, 500)); 
    frame.pack(); 
    frame.setVisible(true); 
} 

protected static ImageIcon createIcon() { 
    BufferedImage bi = new BufferedImage(25,25,BufferedImage.TYPE_INT_ARGB); 
    Graphics g = bi.createGraphics(); 
    g.setColor(Color.RED); 
    g.fillOval(0,0, 25, 25); 
    return new ImageIcon(bi); 
} 

} 
+1

Может быть полезно опубликовать скриншот! а также ссылку на страницу отчета об ошибке, если она у вас есть! – flakes

ответ

1

enter image description here

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class WinMenuItemIconTest { 
    private static JMenuBar makeManuBar() { 
    JMenuItem menuItem0 = new JMenuItem("Command", createIcon()); 

    JMenuItem menuItem1 = new JMenuItem("LEFT bug?", createIcon()); 
    menuItem1.setHorizontalTextPosition(SwingConstants.LEFT); 
    //menuItem1.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 

    JMenuItem menuItem2 = new JMenuItem("CENTER bug?", createIcon()); 
    menuItem2.setHorizontalTextPosition(SwingConstants.CENTER); 

    JMenuItem menuItem3 = new JMenuItem("RIGHT_TO_LEFT", createIcon()); 
    menuItem3.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); 

    JMenu menu = new JMenu("Menu"); 
    menu.add(menuItem0); 
    menu.add(menuItem1); 
    menu.add(menuItem2); 
    menu.add(menuItem3); 

    JMenuBar menuBar = new JMenuBar(); 
    menuBar.add(menu); 
    return menuBar; 
    } 
    public static void main(String[] args) { 
    EventQueue.invokeLater(() -> { 
     //NOTE: Bug happens with Windows L&F 
     String name = UIManager.getSystemLookAndFeelClassName(); 
     try { 
     UIManager.setLookAndFeel(name); 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setJMenuBar(makeManuBar()); 
     frame.setSize(320, 240); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    }); 
    } 
    protected static ImageIcon createIcon() { 
    BufferedImage bi = new BufferedImage(25, 25, BufferedImage.TYPE_INT_ARGB); 
    Graphics g = bi.createGraphics(); 
    g.setColor(Color.RED); 
    g.fillOval(0, 0, 25, 25); 
    g.dispose(); 
    return new ImageIcon(bi); 
    } 
} 
+0

Это прекрасно работает, спасибо! JMenuItem.setComponentOrientation (ComponentOrientation.RIGHT_TO_LEFT); – kjohnson

3

Удалить строку

menuItem.setHorizontalTextPosition(SwingConstants.LEFT); 

и вы будете иметь только 1 Icon

или если заявление использовать, чтобы исключить эту линию для окон выглядеть и чувствовать себя следующим образом

if(!UIManager.getLookAndFeel().equals("com.sun.java.swing.plaf.windows.WindowsLookAndFeel")) 
{ 
    menuItem.setHorizontalTextPosition(SwingConstants.LEFT); 
} 

enter image description here

вот альтернатива коду @ aterai, который будет работать лучше, если подстроить немного больше в соответствии с вашими потребностями, возможно, это какая-то ошибка, но здесь это делает я не уверен, как @aterai нуждается в центре, чтобы выглядеть, но вот что Я предположил: -

import java.awt.*; 
import java.awt.image.BufferedImage; 
import javax.swing.*; 

public class WinMenuItemIconTest { 
private static JMenuBar makeManuBar() { 

    JMenuItem menuItem0 = new JMenuItem("Command", createIcon()); 

    JMenuItem menuItem1 = new JMenuItem("LEFT bug?", createIcon()); // always left by defaulr 


    JMenuItem menuItem2 = new JMenuItem("CENTER bug?", createIcon()); 

    menuItem2.setMargin(new Insets(5, 50, 5, 5)); // using set margin to centerise 

    JMenuItem menuItem3 = new JMenuItem("RIGHT_TO_LEFT", createIcon()); 
    menuItem3.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT); // Right to left seems to work 

    JMenu menu = new JMenu("Menu"); 
    menu.add(menuItem0); 
    menu.add(menuItem1); 
    menu.add(menuItem2); 
    menu.add(menuItem3); 

    JMenuBar menuBar = new JMenuBar(); 
    menuBar.add(menu); 
    return menuBar; 

    } 
     public static void main(String[] args) { 
     EventQueue.invokeLater(() -> { 
      //NOTE: Bug happens with Windows L&F 
      String name = UIManager.getSystemLookAndFeelClassName(); 
      try { 
      UIManager.setLookAndFeel(name); 
      } catch (Exception e) { 
      e.printStackTrace(); 
      } 
      JFrame frame = new JFrame("Test"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setJMenuBar(makeManuBar()); 
      frame.setSize(320, 240); 
      frame.setLocationRelativeTo(null); 
      frame.setVisible(true); 
     }); 
     } 
     protected static ImageIcon createIcon() { 
     BufferedImage bi = new BufferedImage(25, 25, BufferedImage.TYPE_INT_ARGB); 
     Graphics g = bi.createGraphics(); 
     g.setColor(Color.RED); 
     g.fillOval(0, 0, 25, 25); 
     return new ImageIcon(bi); 
     } 
    } 

enter image description here

Примечание: - Я на Windows 10 тоже

 Смежные вопросы

  • Нет связанных вопросов^_^