Лучший способ реализовать подсказки для JTree?

Несколько наблюдений:

  1. Ваш код предполагает, что UIGraphicsImageRenderer генерирует изображения со шкалой 1, тогда как по умолчанию он равен 0 (т.е. независимо от масштаба, который использует ваше устройство).

    Вместо этого установите шкалу в 1:

    let format = UIGraphicsImageRendererFormat()
    format.scale = 1
    let renderer = UIGraphicsImageRenderer(size: CGSize(width: 200, height: 200), format: format)
    
  2. Здесь не проблема, но мы должны отметить, что ваш код предполагает, что формат [113 ] будет определенный порядок и формат байтов, как и ваш imageFromARGB32Bitmap. Если вы посмотрите на Техническую ноту Apple 1509 (из которой ваш код, несомненно, был изначально адаптирован), они не просто предполагают, что буфер будет в определенном формате. Когда мы хотим манипулировать / исследовать буфер, мы должны (а) создать контекст желаемого формата, (б) нарисовать наше изображение (или что-то еще) в этом контексте, и только тогда мы сможем надежно посмотреть на данные поставщика. [ 1127]

  3. imageFromARGB32Bitmap работает, но я немного нервничаю.

    • Использование MemoryLayout.size: Apple рекомендует :

      При выделении памяти для нескольких экземпляров T с использованием небезопасного указателя, используйте кратное stride типа вместо его size.

      blockquote>

      Итак, я бы использовал stride.

    • Что, если stride не было 4, как вы ожидаете? Я не могу себе представить, что когда-либо не будет 4, но с поставщиком данных предполагает, что они будут упакованы. Это небольшое наблюдение, но я мог бы сделать это предположение явным.

    • Мы уверены на 100%, что разыменование &data даст нам непрерывный буфер? Я бы склонился к withContiguousStorageIfAvailable просто чтобы быть в безопасности.
      & nbsp;

    Например:

    func imageFromARGB32Bitmap(pixels: [PixelData], width: Int, height: Int) -> UIImage? {
        guard width > 0,
            height > 0,
            pixels.count == width * height else { return nil }
    
        let rgbColorSpace = CGColorSpaceCreateDeviceRGB()
        let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedFirst.rawValue)
        let bitsPerComponent = 8
        let bitsPerPixel = 32
    
        let stride = MemoryLayout.stride
        assert(stride == 4)
    
        return pixels.withContiguousStorageIfAvailable { bufferPointer -> UIImage? in
            let data = Data(buffer: bufferPointer)
    
            return CGDataProvider(data: data as CFData)
                .flatMap { CGImage(width: width,
                                   height: height,
                                   bitsPerComponent: bitsPerComponent,
                                   bitsPerPixel: bitsPerPixel,
                                   bytesPerRow: width * stride,
                                   space: rgbColorSpace,
                                   bitmapInfo: bitmapInfo,
                                   provider: [111],
                                   decode: nil,
                                   shouldInterpolate: true,
                                   intent: .defaultIntent) }
                .flatMap { UIImage(cgImage: [111]) }
            } ?? nil
    }
    
    [1119 ]

18
задан Touko 7 November 2008 в 14:58
поделиться

2 ответа

См. getTooltipText на JTree. Это должно позволить Вам показывать подсказки в зависимости от того, что в дереве колеблется. (Действительно прочитайте документы, хотя, необходимо зарегистрировать JTree в ToolTipManager.)

15
ответ дан 30 November 2019 в 09:15
поделиться

Да, вы можете использовать onMouseMoved , а затем использовать метод (название не помню), который сообщает вам, на каком узле вы закончили. Если вы получите ноль, очевидно, что вы не находитесь над узлом.

1
ответ дан 30 November 2019 в 09:15
поделиться
Другие вопросы по тегам:

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